要获取空终止字符串的长度,我们只需编写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)
{
/*............*/
}
答案 0 :(得分:6)
不,你不能。内存权限在大多数(如果不是全部)架构上都没有这种粒度。
几乎所有CPU架构都在页面中管理内存。在今天你遇到的大多数事情中,一页是4kB。没有切实可行的方法来控制任何小于此的权限。
大多数内存管理都是由你的libc从内核中分配一大块内存,然后将较小的内核分发给单个malloc
调用来完成的。这样做是为了提高性能(除其他外),因为创建,删除或修改内存映射是一项昂贵的操作,尤其是在多处理器系统上。
对于堆栈(如示例所示),分配甚至更简单。内核知道&#34;这个大的内存区域将被堆栈使用&#34;和内存访问只是简单地分配必要的页面来支持它。所有跟踪程序堆栈分配的都是一个寄存器。
答案 1 :(得分:0)
如果你想要实现这一目标,那么通过携带自己的大小来分配就可以了,那么就这样做:
通过在内存中添加内存大小(从内存中写入,尚未测试)来包装malloc并释放:
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];
}