C 通过写权限检查获取数组大小
要获得以null结尾的字符串的长度,我们只需编写C 通过写权限检查获取数组大小,c,arrays,C,Arrays,要获得以null结尾的字符串的长度,我们只需编写len=strlen(str),然而,我经常在这里看到这样的帖子,比如说要获得int数组的大小,你需要自己跟踪它,这是我通常做的。但是,我有一个问题,我们是否可以使用某种写权限检查来获得大小,该检查检查我们是否有对内存块的写权限?例如: #include <stdio.h> int getSize(int *arr); bool permissionTo(int *ptr); int main(void) { int arr
len=strlen(str)
,然而,我经常在这里看到这样的帖子,比如说要获得int
数组的大小,你需要自己跟踪它,这是我通常做的。但是,我有一个问题,我们是否可以使用某种写权限检查来获得大小,该检查检查我们是否有对内存块的写权限?例如:
#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)
{
/*............*/
}
#包括
int getSize(int*arr);
bool许可证(int*ptr);
内部主(空)
{
int-arr[3]={1,2,3};
int size=getSize(arr)*sizeof(int);
}
int getSize(int*arr)
{
int*ptr=arr;
int size=0;
while(许可证(ptr))
{
大小++;
ptr++;
}
返回大小;
}
bool许可证(int*ptr)
{
/*............*/
}
不,你不能。内存权限在大多数(如果不是全部)体系结构上没有这种粒度
几乎所有的CPU架构都以页的形式管理内存。在今天遇到的大多数情况下,一页是4kB。没有切实可行的方法来控制任何小于此值的权限
大多数内存管理是由libc从内核分配一大块:ish内存,然后将小块内存分配给各个malloc
调用来完成的。这样做是为了提高性能(除其他外),因为创建、删除或修改内存映射是一项昂贵的操作,特别是在多处理器系统上
对于堆栈(如您的示例中所示),分配更加简单。内核知道“这个大内存区域将被堆栈使用”,对它的内存访问只是简单地分配必要的页面来支持它。跟踪程序对堆栈分配所做的所有操作都是一个寄存器。如果您正试图实现,则可以通过携带自己的大小使分配变得易于使用,然后执行以下操作:
通过在内存内部加上大小前缀(从内存写入,尚未测试),包装malloc并释放:
此外,您可能有权限写入数组之外的数据:int data[8];你也有写这封信的权限代码>
void* myMalloc(long numBytes) {
char* mem = malloc(numBytes+sizeof(long));
((long*)mem)[0] = numBytes;
return mem+sizeof(long);
}
void myFree(void* memory) {
char* mem = (char*)memory-sizeof(long);
free(mem)
}
long memlen(void* memory) {
char* mem = (char*)memory-sizeof(long);
return ((long*)mem)[0];
}