通过写入权限检查获取阵列的大小

mac*_*e_1 3 c arrays

为了获得空终止字符串的长度,我们只是简单地写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)

Art*_*Art 6

不,你不能.内存权限在大多数(如果不是全部)体系结构上都没有这种粒度.

几乎所有CPU架构都在页面中管理内存.在今天你将遇到的大多数事情上,一页是4kB.没有切实可行的方法来控制小于此的任何东西的权限.

大多数内存管理都是由你的libc从内核中分配一大块内存,然后将更小的内存分发给各个malloc调用来完成的.这样做是为了提高性能(除其他外),因为创建,删除或修改内存映射是一项昂贵的操作,尤其是在多处理器系统上.

对于堆栈(如示例所示),分配甚至更简单.内核知道"堆栈将使用这个大面积的内存",对它的内存访问只是简单地分配必要的页面来支持它.所有跟踪程序的堆栈分配都是一个寄存器.