C计数分配内存

C计数分配内存,c,memory-management,C,Memory Management,我必须制作一个程序,用mmap()分配int数组,然后计算实际分配给它的内存量 到目前为止,我有分配数组的代码,但我不知道如何计算分配的内存。这就是我迄今为止所尝试的: 处理程序: int i; void segfault_sigaction(int signal, siginfo_t *si, void *arg) { printf("ujel segafult, velikost pomnilnika je: %d bajtov\n", sizeof(int) * i);

我必须制作一个程序,用
mmap()
分配
int
数组,然后计算实际分配给它的内存量

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

处理程序:

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

mmap()
映射的内存量正是您所要求的,可能是四舍五入的。如果你问,“我怎么才能知道它到底凑了多少”,答案是你不能以一般的方式这样做,但是一些特定的平台可能有API可以让你找到答案。但你没有理由这么做


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

mmap()
映射的内存量正是您所要求的,可能会向上舍入一点。如果你问,“我怎么才能知道它到底凑了多少”,答案是你不能以一般的方式这样做,但是一些特定的平台可能有API可以让你找到答案。但你没有理由这么做


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

当然,不要使用代码中出现的
sizeof
。我必须计算分配给程序的所有内存,从任务描述中可以看出。它说应该通过移动数组的最后一个元素来完成,然后继续,直到我得到一个SEGFAULT错误。@TimPungračIč这是不可靠的:它后面可能有其他映射(例如程序代码)。大多数平台都提供了一种分析程序内存映射的方法,但它依赖于操作系统,例如在Linux上解析
/proc/self/maps
。感谢您的解释,但遗憾的是,这正是任务对我的期望。分配一个整数数组,然后检查并输出分配给整个程序的内存量。@TimPungračičNote“检查并输出分配给整个程序的内存量”和“计算分配的内存”是两件完全不同的事情。前者只能通过使用特定于系统的功能来完成。查看
mallinfo()
当然,不要使用代码中出现的
sizeof
。我必须计算分配给程序的所有内存,从任务描述中可以看出。它说应该通过移动数组的最后一个元素来完成,然后继续,直到我得到一个SEGFAULT错误。@TimPungračIč这是不可靠的:它后面可能有其他映射(例如程序代码)。大多数平台都提供了一种分析程序内存映射的方法,但它依赖于操作系统,例如在Linux上解析
/proc/self/maps
。感谢您的解释,但遗憾的是,这正是任务对我的期望。分配一个整数数组,然后检查并输出分配给整个程序的内存量。@TimPungračičNote“检查并输出分配给整个程序的内存量”和“计算分配的内存”是两件完全不同的事情。前者只能通过使用特定于系统的功能来完成。查看
mallinfo()