为了获得空终止字符串的长度,我们只是简单地写len = strlen(str),我经常在SO帖子上看到int例如,要获得数组的大小,你需要自己跟踪它,这就是我正常做的事情但是,我有一个问题,我们是否可以通过使用某种方式来获取大小write permission check,检查我们是否具有对内存块的写入权限?例如 :
#include <stdio.h>
int getSize(int *arr);
bool permissionTo(int *ptr);
int main(void)
{
int arr[3] = {1,2,3};
int size = getSize(arr) * sizeof(int);
}
int getSize(int *arr)
{
int *ptr = arr;
int size = 0;
while( permissionTo(ptr) )
{
size++;
ptr++;
}
return size;
}
bool permissionTo(int *ptr)
{
/*............*/
}
Run Code Online (Sandbox Code Playgroud)
不,你不能.内存权限在大多数(如果不是全部)体系结构上都没有这种粒度.
几乎所有CPU架构都在页面中管理内存.在今天你将遇到的大多数事情上,一页是4kB.没有切实可行的方法来控制小于此的任何东西的权限.
大多数内存管理都是由你的libc从内核中分配一大块内存,然后将更小的内存分发给各个malloc调用来完成的.这样做是为了提高性能(除其他外),因为创建,删除或修改内存映射是一项昂贵的操作,尤其是在多处理器系统上.
对于堆栈(如示例所示),分配甚至更简单.内核知道"堆栈将使用这个大面积的内存",对它的内存访问只是简单地分配必要的页面来支持它.所有跟踪程序的堆栈分配都是一个寄存器.