2016-11-26 25 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