2012-01-09 84 views
-2

我想保留一個動態分配的字符串數組,使用c中的讀系統調用讀入。這裏是什麼,我試圖做一個小樣本:calloc/malloc並讀取奇怪的行爲?

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

void processInput() { 
    char ** array = (char **) calloc(20, sizeof(char*)); 
    int arrayIndex = 0; 
    while(1) { 
     printf("Type something: "); 
     fflush(stdout); 

     char* buffer; 
     int readResult = read(0, buffer, 100); 

     array[arrayIndex] = (char*)calloc(readResult, sizeof(char)); 
    } 
}  

然而,這會導致一些奇怪的問題:

 

    Type something: a 
    Type something: Type something: a 
    Type something: Type something: abcdefg 
    Type something: Type something: Type something: Type something: Type something: Type something: Type something: Type something: 

有沒有做任何解釋?我似乎無法弄清楚爲什麼會發生這種情況。

+3

'char * buffer; readResult = read(0,buffer,100);'使用未初始化的變量 - 特別是未初始化的指針 - 只能以淚結束。 – 2012-01-09 04:08:55

+1

你並沒有遞增'arrayIndex' – Kevin 2012-01-09 04:13:41

+0

不好意思,這個例子有點草率。你是正確的,我沒有增加arrayIndex,但它不是重要的例子。但是,在實踐中,你需要增加arrayIndex是100%正確的。否則,它不會存儲索引0中最後添加的項目:P。 – Ryan 2012-01-09 04:17:09

回答

2

替換:

char *buffer; 

有:

char buffer[100]; 

尺寸與參數read()一致的,但你的字符串不會被read()被空值終止的,所以你可能更願意分配101字節,而不是強制終止它。分配空間時需要考慮額外的字節。

請注意,未使用分配的空間。

在使用它們之前,應該總是檢查內存分配。

由於您只在循環之前分配20個指針,因此while (1)循環很危險,並且如果用戶輸入的數據超過20行,可能會使您踐踏得超出分配的空間。 (請注意,如果用戶重定向來自文件的輸入,則不會讀取20行;您將在包含100個字符,換行符和全部的20個塊中讀取2000個字符,然後運行到崩潰區域。 )

0

從看你的輸出,它看起來像它的輸入中的每個字符循環運行。