簡體   English   中英

malloc和realloc分段錯誤

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM