我正在嘗試從 C 中的標準輸入讀取一行,同時使用下面的代碼片段為字串動態分配記憶體。問題是當我運行這段代碼時,呼叫類似的東西strlen(msg)會導致Conditional jump or move depends on uninitialised value(s)in valgrinds 輸出。
我不明白如何解決這個問題,因為如果我動態分配它,我將無法正確初始化它。我現在已經在這上面花了很長時間,但似乎無法弄清楚……任何幫助將不勝感激。
char* msg = NULL;
int c;
// set initial size for dynamic allocation
msg = malloc(sizeof(char)*10 1);
int idx = 0;
char* temp = NULL;
size_t size = 10;
while (1){
c = getchar();
if(c == EOF || c == '\n'){
break;
}else if(!isalpha(c)){
free(msg);
exit(100);
}
// dynamically reallocate memory if input too large
if(size <= idx){
size = size;
temp = realloc(msg, size);
msg = temp;
}
msg[idx ] = (char)c;
}
printf("%ld", strlen(msg));
uj5u.com熱心網友回復:
您永遠不會終止您在msg.
在回圈之后(但在使用msgeg 作為空終止字串之前strlen(msg))添加終止符:
msg[idx] = '\0';
但是還有另一個問題,它可能會意外出現:當您重新分配記憶體時,您不會為終結符添加空間。
此問題的用例:您輸入的字串完全包含20字符。
然后您將重新分配一次,使大小正好為20位元組(字符)。最后一個字符將放在 index 處19,然后idx增加到20(超出范圍)。回圈的下一次迭代檢測到換行符并跳出,然后將終止符設定在 20 字符陣列中的第21:st個字符上。
1呼叫時添加尺寸realloc來解決這個問題:
temp = realloc(msg, size 1);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/534181.html
上一篇:structnode*voidexpectedidentifier或'('before'void'
下一篇:結構識別符號未定義,即使它是
