2013-05-14 66 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。