[問題] realloc的錯誤

看板C_and_CPP (C/C++)作者 (自我判斷 永保平靜)時間15年前 (2011/04/22 21:45), 編輯推噓0(0033)
留言33則, 5人參與, 最新討論串1/1
剛剛想測試malloc跟realloc這兩個function 先用malloc宣告一個3 int大小的array 如果不夠用的話 再用realloc擴充 但是執行的時候 跑到realloc那行,總是出現Segmentation Fault 請好心人告訴我 問題在哪邊 感謝:) 程式碼如下 #include<stdio.h> #include<stdlib.h> int main(){ int *ptr,*newptr; int size=0,a; int mem_size=3; ptr = malloc( sizeof(int)*3 ); do{ scanf("%d",&a); size++; if( size>mem_size ){ newptr = realloc( ptr, sizeof(int)*(mem_size+3)); => 上面這行執行完後出現Segmentation Fault if( newptr==NULL){ fprintf(stderr,"can't realloc\n"); exit(-1);} mem_size+=3; } ptr = newptr; ptr[size-1]=a; }while(a!=-1); return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.248.43

04/22 21:48, , 1F
你一開始的 newptr 沒有初始化,而做了 ptr = newptr;
04/22 21:48, 1F

04/22 21:49, , 2F
這樣你的資料就會寫到莫名其妙的地方去
04/22 21:49, 2F

04/22 21:50, , 3F
在我的電腦裡,迴圈跑第一次就 Segmentation fault 了
04/22 21:50, 3F
※ 編輯: s007150628 來自: 140.112.248.43 (04/22 21:53)

04/22 21:55, , 4F
把 realloc 記成「還回記憶體再配置一塊回來, 儘可能
04/22 21:55, 4F

04/22 21:56, , 5F
從第一個參數的位置算起」所以當 ptr的那一塊已經被還
04/22 21:56, 5F

04/22 21:56, , 6F
回去了, 之後你再給建議就沒什麼用
04/22 21:56, 6F

04/22 21:58, , 7F
= =" 前幾樓請無視, 謝謝
04/22 21:58, 7F

04/22 22:14, , 8F
如果把第36行改成下面兩行就會對
04/22 22:14, 8F

04/22 22:15, , 9F
newptr = realloc( NULL, sizeof(int)*3 );
04/22 22:15, 9F

04/22 22:15, , 10F
ptr = newptr;
04/22 22:15, 10F

04/22 22:15, , 11F
這樣看起來 好像如果從頭到尾都用realloc就沒事@@||
04/22 22:15, 11F

04/22 22:15, , 12F
在do前加這行 newptr=ptr; j大已指出問題
04/22 22:15, 12F

04/22 22:16, , 13F
請問是什麼原理阿? THQ
04/22 22:16, 13F

04/22 22:16, , 14F
你的 36 行是哪一行啊...?
04/22 22:16, 14F

04/22 22:18, , 15F
就是BBS上的36行~
04/22 22:18, 15F

04/22 22:19, , 16F
你把ptr = newptr;跟上面那行括號掉換位置就會對了
04/22 22:19, 16F

04/22 22:19, , 17F
我想說realloc回傳的是一個位址 剛好可以assign給
04/22 22:19, 17F

04/22 22:19, , 18F
什麼什麼原理阿??
04/22 22:19, 18F

04/22 22:19, , 19F
newptr所以就沒做初始化了y
04/22 22:19, 19F

04/22 22:19, , 20F
你那個等同 newptr = malloc( sizeof(int) * 3 );
04/22 22:19, 20F

04/22 22:20, , 21F
結果你根本無視我在一樓的推文 〒△〒
04/22 22:20, 21F

04/22 22:20, , 22F
我都不知道該不該繼續回了
04/22 22:20, 22F

04/22 22:22, , 23F
沒錯,其實j大一開始就講到重點了@@"
04/22 22:22, 23F

04/22 22:22, , 24F
我看了J大的推文以後 就把pointer都初始化了
04/22 22:22, 24F

04/22 22:23, , 25F
但是還是Segmentation Fault 感謝J大回
04/22 22:23, 25F

04/22 22:25, , 26F
T 大的改法更好. 應該有realloc時才需要 UPDATE ptr;放if內
04/22 22:25, 26F

04/22 22:26, , 27F

04/22 22:26, , 28F
======================================
04/22 22:26, 28F

04/22 22:26, , 29F
感謝大家....就是T大講的= = ptr=newptr應該要放裡面
04/22 22:26, 29F

04/22 22:27, , 30F
解決了 謝謝!
04/22 22:27, 30F

04/22 22:27, , 31F
======================================
04/22 22:27, 31F

04/22 22:28, , 32F
感謝james幫我修改code~
04/22 22:28, 32F

04/22 22:29, , 33F
我建議你用j大連結裡提供的做法,可以少宣告一個指標
04/22 22:29, 33F
文章代碼(AID): #1DiOPnLn (C_and_CPP)
文章代碼(AID): #1DiOPnLn (C_and_CPP)