【发布时间】:2013-05-09 05:18:21
【问题描述】:
今天,我问我,char ** 对象是如何保存在内存或二进制文件中的。我使用以下代码 sn-p 进行了测试:
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)
编译器如何知道数组中每个字符串的长度?
【问题讨论】:
-
您的程序不可能产生这些结果,因为字符串从未写入文件。哎呀,您发布的代码甚至没有从文件中读取。所以这是一个巨魔帖子。
-
char**不是对象,而是指针。字节保存在文件中。 -
下次您在 SO 提出问题时,发布您运行的实际代码,不要从内存中重构它,或者用一堆省略号对其进行编辑。这对于那些对 C 了解甚少并倾向于产生各种他们没有意识到是错误的错误想法的初学者来说尤其重要。
标签: c arrays string file memory