C计数分配的内存

时间:2016-11-26 11:12:00

标签: c memory-management

我必须创建一个程序,将int数组与mmap()分配,然后计算实际分配给它的内存量。

到目前为止,我有分配数组的代码,但我不知道如何计算分配的内存。这是我到目前为止所尝试的:

处理程序:

 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的处理程序,但它不是真的可靠(有时它可以工作,有时会出现默认的分段错误错误)。

1 个答案:

答案 0 :(得分:4)

mmap()映射的内存量正是您所请求的内存量,可能会稍微向上舍入。如果你问,“我怎么能看到它被围捕了多少”,答案是你不能以一般的方式这样做,但是一些特定的平台可能有API让你弄明白。但是没有理由你需要。

您编写的代码似乎是通过查找非零部分来“搜索”分配的结尾。这会导致未定义的行为,因为您将始终在分配结束时运行。你绝对不能这样做。只需使用传递给mmap()的大小作为大小。这是唯一重要的尺寸。