我现在对c编程非常感兴趣,我正在编写一个用于动态内存分配的c程序。
这是该计划的各个阶段:
n
个号码
n
个号码我的程序适用于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);
}
答案 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
,并且您肯定应该测试malloc
,calloc
或realloc
的结果(所有可以返回NULL
)失败。
正如Mat回答,你的realloc
电话不正确。