[英]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.