[英]malloc and realloc segmentation fault
我在linux上工作,并用作giller编译器。 我对malloc和realloc函数有一些了解,以了解其工作原理。 但是当我执行程序时,给我分段错误。 接下来我的代码:
#include<stdio.h>
#include<stdlib.h>
int main(){
register int cont=1;
int i,n,*a;
a=(int*)malloc(sizeof(int));
scanf("%d",&n);
while(n!=0){
if(a!=NULL)
a=(int*)realloc(a,cont*sizeof(int));
else
goto exit;
a[i]=n;
scanf("%d",&n);
cont++;
i++;
}
for(i=0;i<cont;i++)
printf("%d\n",a[i]);
free(a);
return 0;
exit: printf("No memory\n");
free(a);
return -1;
}
为什么这不起作用,我的代码有什么问题?
i
从来没有初始化过,所以a[i]=n;
可能导致分割错误。 更改为:
int i = 0;
您的代码还有其他一些改进,例如, 不要malloc
的结果,在我看来,您不需要使用goto
,并且register
关键字可能没有用。
在while循环中,用户输入0后,它将存储在n
,您将cont
递增,而while循环再次检查输入条件n != 0
它失败了(因为n的值现在为0)并退出了循环而不将n
值存储到a
,这就是为什么在输出的最后一位得到不确定的值的原因。
当使用realloc时,不应将返回值直接存储到试图增加大小的指针变量中,因为realloc失败时返回NULL,最终会擦除内存缓冲区的句柄/地址。
register int cont = 1;
int i = 0,n,*a;
int *temp;
a = (int*)malloc(sizeof(int));
if(a == NULL) goto exit;
while(1){
scanf("%d", &n);
temp = (int*)realloc(a, cont * sizeof(int));
if(temp == NULL)
goto exit;
else
a = temp;
a[i++] = n;
if(n == 0) // put the condition here if u want to store 0
break;
else
cont++;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.