2013-10-08 53 views
1

我做了一個關於把輸入到字符指針的測試案例。當我嘗試運行這個程序時,輸出是不正確的(它變成了一系列隨機字符,如:_ @ $)。我打算在該字符指針中打印每個元素。 我對代碼進行了一些更改,但仍然是錯誤的(和以前一樣)。 有人能幫我弄清楚出了什麼問題以及解決問題的方法嗎?閱讀輸入,並把它放到字符指針

int chara; 
int counts =0; 

main(){ 

    char *buffer=(char *)malloc(sizeof(char)*25); 
    while((chara=getchar())!= EOF&& counts<25){ 
     *buffer++ = chara; 
     printf("%c\n",*buffer); 
     counts++; 

    } 
    *buffer = '\0'; 
    printf("%s\n",buffer); 
    free(buffer); 
} 
+0

'sizeof(20)== 4'。這不是你想要的。 – SLaks

+0

'sizeof(20)'不會做你所想的。如果你想分配20個字節,你需要'malloc(20)'。另外,請具體說明。說「輸出不正確」使其很難提供幫助。 – lurker

+0

你應該添加一些東西到你的循環中,當你得到所有的緩衝區中的一個字節時,停止它。你擁有的那個將永遠運行,覆蓋緩衝區之後的任何內容(很可能)。 –

回答

2

由於您在循環中增加了buffer的值,循環後的代碼是錯誤的。您不能free()增加buffer,這將指向一個尚未由malloc()返回的地址。

基本上你正在做的:

char *buffer = malloc(25); 
... 
free(buffer + length of string the user entered); 

這意味着,你傳遞給free()地址不再是被malloc()返回,這是錯誤的一樣。

+0

我不明白這一點,我認爲free()的只是釋放我分配的緩衝區的內存。爲什麼它指向malloc()不返回的地址? – Arabeka

+0

因爲你不斷遞增'buffer'所以它不是在內存的開始指向 - 和你自由必須是由malloc返回的地址。 –

2

修改您的代碼。

int chara; //getchar() returns int 
    int i=0; 
    char *buffer=malloc(20); //allocate correctly 
    while( ((chara=getchar())!= EOF) && (i!=19)) { //check against EOF and check counter value to avoid input with legth greater than allocated size. 
     buffer[i]= chara; 
     //use indexing with counter variable to avoid errors with free() 
     // if change pointer you can't free() memory 
     printf("%c\n",buffer[i++]); 
    } 

    buffer[i] = '\0'; 
    printf("%s\n",buffer); 
    free(buffer); 
+1

如果輸入超過19個字符,仍然需要一個計數器來確保緩衝區沒有溢出。 –

+0

確實。加入計數器檢查。 – Gangadhar

+0

好吧,即使添加了計數器,它仍然不會按照預期的那樣在字符指針中打印值。輸出只是隨機字符 – Arabeka

0

你的另一個問題是這樣的:

*buffer++ = chara; 
    printf("%c\n",*buffer); 

打印出的垃圾 - 你分配charabuffer指向,增加buffer,然後打印出buffer現在指向(初始化)的位置。

改爲打印chara

+0

是的,我明白了。它會導致問題 – Arabeka

相關問題