2015-11-19 86 views
3

爲了獲得以空字符結尾的字符串的長度,我們只需編寫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) 
{ 
    /*............*/ 
} 

回答

6

不,你不能。內存權限在大多數(如果不是全部的話)體系結構上都沒有這種粒度。

幾乎所有的CPU架構都以頁面的形式管理內存。在你今天遇到的大多數事情中,一頁是4kB。沒有實際的方法來控制比這更小的任何權限。

大部分的內存管理都是由你的libc從內核中分配一大塊內存,然後將更小的塊分配給各個調用的malloc。這是爲了性能(除其他外),因爲創建,刪除或修改內存映射是一項昂貴的操作,尤其是在多處理器系統上。

對於堆棧(如你的例子),分配更簡單。內核知道「這個大的內存區域將被堆棧使用」,並且內存訪問它只是簡單地分配必要的頁面來支持它。所有跟蹤程序的堆棧分配都是一個寄存器。

+0

此外,您可能有權寫入超出數組的數據:'int data [8]; int you_have_write_permission_to_this_too;' –

+0

不是4吉比嗎? – Kotshi

0

如果你想才達到,即分配變得舒適的揹負着自己的大小,然後做到這一點使用方法:用內部大小前綴內存

裹malloc和free(從內存中寫的,不測試還未):

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]; 
}