Segmentation fault (core dumped)
在C中,我初始化了一个字符串数组,如下所示:
char* strings[20];
然后尝试了fscanf
一堆东西。
for(int i = 0; i<20; i++){
fscanf(file, "%s", strings[i]);
}
虽然该程序还有更多内容,但我确信这是导致分段错误的部分。使用gdb运行表明错误在文件 vfscanf
中,所以我认为这是相关的。
答案 0 :(得分:4)
宣布后
char* strings[20]; // This is an array of pointer of type char *
您需要为每个指针分配内存,然后才能从文件中读取它们。
for(int i = 0; i<20; i++){
strings[i] = malloc(some_size * sizeof(char)); // allocate memory for each pointer first.
fscanf(file, "%s", strings[i]);
}
答案 1 :(得分:1)
char* strings[20];
没有初始化&#34;字符串&#34;数组。
而strings
是一个包含20个char *
指针的数组。 C中的字符串是char
的数组,最多包含尾部'\0'
。到目前为止,数组Strings[]
具有不确定的值,并且没有元素肯定指向字符串。
通过将这20个指针分配给各种字符串,您将拥有一个&#34;字符串数组&#34;。
// Assign 0 (or NULL) to each pointer.
char* strings[20] = { 0 };
for(int i = 0; i<20; i++){
char buffer[100];
if (fscanf(file, "%99s", buffer) != 1) {
break;
}
strings[i] = strdup(buffer);
// or
size_t len = strlen(buffer) + 1;
strings[i] = memcpy(malloc(len), buffer, len); // error check omitted
}
答案 2 :(得分:1)
请注意,如果您拥有足够现代的POSIX兼容版scanf()
(请查看系统手册),您可以使用:
for (int i = 0; i < 20; i++)
{
if (fscanf(file, "%ms", &strings[i]) != 1)
…report error and break/return…
}
使用%ms
转换规范,scanf()
将使用malloc()
为其读取的字符串分配适当的内存量。当你完成记忆时,不要忘记free()
。
请注意,Mac OS X(10.9.5 Mavericks)没有足够现代的scanf()
版本。 Linux(例如,在Ubuntu 14.04中可以找到)。