c中的内存重新分配

时间:2012-11-11 07:39:25

标签: c dynamic-memory-allocation

我现在对c编程非常感兴趣,我正在编写一个用于动态内存分配的c程序。

这是该计划的各个阶段:

  1. 从用户
  2. 获取n个号码
  3. 打印它们
  4. 它从用户那里得到另一个n个号码
  5. 打印两组数字
  6. 我的程序适用于n的小值,但不适用于大号值,例如200000个数字。即首先我输入了100000个数字然后我输入了另外100000个数字。

    它对第一组执行正常,但随后它给出了分段错误。我使用gdb进行调试。它显示了SIGSEGV错误。

    任何人都可以解释发生了什么并给我一个解决方案吗?

    #include<stdio.h>
    #include<malloc.h>
    int main(void)
    {
    
        unsigned int *p=NULL;
        unsigned int n;
        unsigned int i;
        unsigned int *a;
        unsigned int *t;
        unsigned int k=0;
    
        printf("Enter no.of elements...");
        scanf("%d", &n);
    
        p = (unsigned int*)malloc(n*sizeof(unsigned int));
        a = p;
        t = p;
        for (i=0; i<n; i++, *p++, k++) {
            scanf("%d",p);
        }
    
        for(i=0;i<n;i++,a++) {
            printf("Element No-%d %d Address->%d\n", i, *a, a);
        }
    
        a=t;
    
        printf("next time...how many elements do you enter");
        scanf("%d",&n);
    
        t=p;
        a = (unsigned int*)realloc((void *)a, n*sizeof(int));
        for (i=0; i<n; i++, *t++ ,k++) {
            scanf("%d",t);
        }
    
        printf("next time...printing..\n");
    
        for (i=0; i<k; i++, a++) {
            printf("Element No-%d %d Address->%d\n",i,*a,a);
        }
    
        free(p);
        free(a);
    
    
    }
    

2 个答案:

答案 0 :(得分:3)

realloc会更改分配的大小,但不会按指定的大小增加分配。

所以你需要做

a=realloc(a, original_size + extent_size);

You don't need to cast the return value of malloc or realloc in C.

另一个注意事项:

t=p;
...
a=t;
...
t=p;
a=realloc(...);

在realloc之后你不能使用t,因为realloc可能已经改变了块的地址。在realloc之后放置t=a;。 (并使用更具描述性的名称,您的代码很难遵循。)

答案 1 :(得分:1)

您应该{@ 1}}和#include <stdlib.h>,而不是#include <stdio.h>,不推荐使用<malloc.h>。还请正确缩进您的代码

这两行:

for(i=0;i<n;i++,*p++,k++)
   scanf("%d",p);
似乎很可疑。为什么*p?我会成功的

for (i=0; i<n; i++, p++)
  if (scanf(" %d", p)<1) 
    exit (EXIT_FAILURE);

不要忘记在编译期间启用所有警告和调试信息(使用gcc表示gcc -Wall -g)并使用调试器(例如gdb)和内存泄漏检测器(例如valgrind)来调试你的程序。

您可能希望使用calloc代替malloc,并且您肯定应该测试malloccallocrealloc的结果(所有可以返回NULL)失败。

正如Mat回答,你的realloc电话不正确。