2016-11-26 26 views
0

我必須做一個程序,將intmmap()分配一個數組,然後計算實際分配了多少內存。C計數分配的內存

到目前爲止,我有分配數組的代碼,但我不知道如何計算分配的內存。這是我試過到目前爲止:

處理程序:

int i; 
void segfault_sigaction(int signal, siginfo_t *si, void *arg) 
{ 
    printf("ujel segafult, velikost pomnilnika je: %d bajtov\n", sizeof(int) * i); 
    exit(0); 
} 

主:

int main(int argc, char* argv[]) 
{ 
    int *addr; 
    int n = atoi(argv[1]); 
    struct sigaction sa; 

    memset(&sa,0,sizeof(sigaction)); 
    sa.sa_handler = segfault_sigaction; 
    //sigemptyset(&sa.sa_mask); 
    //sa.sa_sigaction = segfault_sigaction; 
    //sa.sa_flags = 0; 

    sigaction(SIGSEGV,&sa, NULL); 

    addr = mmap(NULL, n * sizeof(int), PROT_WRITE | PROT_READ ,MAP_ANONYMOUS | MAP_PRIVATE,-1,0); 
    i = n; 

    while(1){ 

     addr[i+1] = 5; 
     i++; 
    }  
    return 0; 
} 

編輯:重新閱讀你的答案和任務的描述後,我改變了代碼,我把一個捕獲SEGFAULT的處理程序,但它不是很可靠(有時可行,有時會出現默認的分段錯誤錯誤)。

回答

4

mmap()映射的內存量正是您所要求的內容,可能會舍入一點。如果你問,「我怎麼能看到它有多大,」答案是你不能以一般的方式這樣做,但一些特定的平臺可能有API讓你知道它。但沒有理由爲什麼你需要。

您編寫的代碼似乎是通過查找非零部分來「搜索」分配的結尾。這會導致未定義的行爲,因爲您將始終運行分配結束。你絕對不能這樣做。只需使用您傳遞給mmap()的尺寸作爲尺寸。這是唯一重要的尺寸。

+1

當然,不使用代碼中出現的'sizeof'。 –

+0

據我可以從任務描述中得知,我必須計算分配給程序的所有內存。它表示應該通過移動數組的最後一個元素來繼續,直到出現SEGFAULT錯誤。 –

+0

@TimPungračič這是不可靠的:可能有一些其他的映射(例如程序代碼)。大多數平臺都提供了一種分析程序內存映射的方法,但是它依賴於操作系統,例如,在Linux上解析'/ proc/self/maps'。 – Gilles