0

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

这些是该计划的阶段:

  1. 它从用户那里获取n数字
  2. 它打印它们
  3. n它从用户那里获得另一个号码
  4. 它打印两组数字

我的程序适用于较小的值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);


}
4

2 回答 2

3

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

所以你需要做

a=realloc(a, original_size + extent_size);

您不需要在 C中转换mallocorrealloc的返回值。 )

另一个注意事项:

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

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

于 2012-11-11T07:43:39.990 回答
1

您应该#include <stdlib.h>and #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)的结果。

正如马特回答的那样,您的realloc电话不正确。

于 2012-11-11T07:44:42.593 回答