2013-05-14 52 views
2

今天,我問我,如何char **對象保存在內存或二進制文件。我測試了用下面的代碼片段:如何保存char **對象?

char **array = (char *)malloc(3 * sizeof(char *)); 

array[0] = "Foo";   // Length: 3 
array[1] = "Long string"; // Length: 11 
array[2] = "Bar";   // Length: 3 => Full length: 17 

int length = 17; 

我寫這個數組到一個文件:

FILE *file = fopen(...); 
fwrite(array, length, 1, file); 
fclose(file); 

偉大的事情是,當我再次從文件中讀取這個數組用下面的代碼中,成功讀取字符串長度,但不保存超過17個字節。

FILE *file = fopen(...); 
int length = 17; 

char **array = (char *)malloc(length); 

int index  = 0; 
int parsedLength = 0; 
while (parsedLength < length) 
{ 
    char *string  = array[index]; 
    int stringLength = strlen(string); 

    printf("%i: \"%s\" (%i)\n", index, string, stringLength); 

    parsedLength += stringLength; 
    ++index; 
} 

我得到一個等於輸出:

0: "Foo" (3) 
1: "Long string" (11) 
2: "Bar" (3) 

如何編譯器知道,在陣列中多久每個字符串是什麼?

+0

您的程序不可能產生這些結果,因爲字符串從未寫入文件。哎呀,你發佈的代碼甚至沒有從文件中讀取。所以這是一個巨魔崗位。 –

+1

'char **'不是一個對象,它是一個指針。字節保存在文件中。 –

+2

下一次你在SO提問時,**發佈你運行的實際代碼**,不要從內存中重建它,或者用一堆橢圓編輯它。這對於那些對C很少理解並且傾向於有各種他們沒有意識到的錯誤想法是錯誤的排名初學者來說尤其重要。 –

回答

13

指針被保存到一個像數字(或更好的地址)的文件,所以你的代碼工作的事實是一個幻想,因爲你可能在相同的運行中保存和加載它們在同一個程序中這些字符串是文字,他們的地址大多是固定在數據段中的)。

你在做什麼是完全錯誤的,因爲數組的內存佈局(我假設4個字節的指針)如下:

XXXXXXXX YYYYYYYY ZZZZZZZZ (= 12 bytes) 
^ ^ ^
    |  |  pointer to "Bar" 
    |  pointer to "Long String" 
pointer to "Foo" 

,但要保存17個字節到文件,其中12個是隻是內存地址。

要正確保存文件中的字符串,您肯定需要存儲包含的全部數據及其長度。例如:

for (int i = 0; i < ARRAY_LENGTH; ++i) { 
    char *string = array[i]; 
    unsigned int length = strlen(string); 
    fwrite(&length, sizeof(unsigned int), 1, out); 
    fwrite(string, sizeof(char), length, out); 
} 

for (int i = 0; i < ARRAY_LENGTH; ++i { 
    unsigned int length; 
    fread(&length, sizeof(unsigned int), 1, in); 
    array[i] = calloc(sizeof(char), length); 
    fread(array[i], sizeof(char), length, in); 
} 
+0

這一個是正確的...... –

+0

所以要保存一個像「Foo」,「長字符串」和「酒吧」的字符串數組,我必須實現我自己的數組結構? –

+0

@ PaulA.Warkentin你爲什麼要發佈巨魔問題?您發佈的代碼無法想像產生了您聲稱的結果。 –

3

在不認爲你的程序工作。 嘗試編寫一個讀取文件的新程序,或嘗試用十六進制編輯器打開二進制文件。字符串不在其中。 char ** array是一個指針數組,不是char數組,其大小在32位常用環境中爲3 * 4 = 12。