2012-12-14 140 views
0

我有問題realloc。這是我的功能,它從輸出中讀取單詞,並在檢測到EOF時終止。 該函數使內存泄漏,以下程序將引發SIGSEGV或SIGABORT。什麼是問題?動態指針數組realloc失敗

int inx=0; 
char **wordList=NULL; 

int v; 
char tmpArr[100]; 

do 
{ 
    v=scanf("%s",tmpArr); 
    if(v!=-1) 
    { 
    char* word=(char*)malloc(strlen(tmpArr)+1); 
    strcpy(word,tmpArr); 
    char**more=(char**)realloc(wordList,sizeof(char*)*(inx+1)); 
    if(more!=NULL) {wordList=more;} else return 1; 
    wordList[inx++]=word; 
    printf("%d\n",inx); 
    } 
} 
+1

你用調試器或添加了額外的'printf'語句找到該行的程序失敗嗎?代碼示例末尾是否存在缺少「while」語句? – simonc

+0

你確定沒有要閱讀的單詞,大於99個字符嗎? – alk

+0

向malloc添加錯誤檢查。不要投射malloc也不要realloc。 – alk

回答

1
v=scanf("%s",tmpArr); 

上述可引起如果輸入的字符串是大於100你可能想使用fgets(tmpArray,sizeof(tmpArray),stdin)代替限制輸入到最大緩衝器尺寸的存儲覆蓋(或使用scanf_s)。

你不應該投什麼的malloc返回時,它返回一個void *,它並不需要轉換,如果你投,你可以,如果你忘了包括stdlib.h中

char* word = /* (char*) */ malloc(strlen(tmpArr)+1); 

增長掩蓋錯誤數組每次讀取新字符串都不是很有效,而是考慮分配一堆字符串指針或最好使用其他數據結構,例如列表

例如

if (inx == maxindex ) 
{ 
    char**more=(char**)realloc(wordList,sizeof(char*)*(maxindex + bunch)); 

    if (more != NULL) 
    { 
    wordList = more; 
    maxindex += bunch ; 
    } 
    else 
    { 
    return 1; 
    } 
} 

...