Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:初始化字符指针(字符串)数组,并使用FGET在文件中迭代,将值放入这些字符串中_C_Arrays_String_Pointers - Fatal编程技术网

C:初始化字符指针(字符串)数组,并使用FGET在文件中迭代,将值放入这些字符串中

C:初始化字符指针(字符串)数组,并使用FGET在文件中迭代,将值放入这些字符串中,c,arrays,string,pointers,C,Arrays,String,Pointers,我想创建一个长度为6的字符指针字符串数组 但是我想通过迭代一个正好分隔了6行的文件来初始化它们 char* a[6]; FILE *fp = fopen("test.txt", "r"); for (int i = 0; i < 6; i++) { fgets(a[i], MAXLEN, fp); } 但它给了我一个分割错误。 如果有人能先编写代码,然后解释到底是什么错了,那就太好了,谢谢。这里 char* a[6]; a是一个由六个字符指针组成的数组,这里 这会导致分段错误,

我想创建一个长度为6的字符指针字符串数组 但是我想通过迭代一个正好分隔了6行的文件来初始化它们

char* a[6];
FILE *fp = fopen("test.txt", "r");
for (int i = 0; i < 6; i++)
{
    fgets(a[i], MAXLEN, fp);
}
但它给了我一个分割错误。 如果有人能先编写代码,然后解释到底是什么错了,那就太好了,谢谢。

这里

char* a[6];
a是一个由六个字符指针组成的数组,这里

这会导致分段错误,因为您试图将MAXLEN字节存储到每个a[i]中,但没有分配内存将其存储到其中。因此,您可以先为下面的a[i]分配内存,然后将数据存储到其中,也可以使用二维字符数组,如char a[num_of_line][max_char_line]

同时检查fopen和fgets的返回值。一旦使用完动态内存,请释放动态分配的内存以避免内存泄漏。

此处

char* a[6];
a是一个由六个字符指针组成的数组,这里

这会导致分段错误,因为您试图将MAXLEN字节存储到每个a[i]中,但没有分配内存将其存储到其中。因此,您可以先为下面的a[i]分配内存,然后将数据存储到其中,也可以使用二维字符数组,如char a[num_of_line][max_char_line]


同时检查fopen和fgets的返回值。一旦使用完动态内存,请释放动态分配的内存以避免内存泄漏。

您创建了一个包含六个指针的数组,但指针值从未初始化或分配。fgets不能做到这一点。相反,它尝试在提供的指针指向的位置写入数据,而在您的情况下,指针指向的位置是不确定的。您需要为文件的每一行分配空间,而不是忽略每一行的字符串终止符的一个字节。如果您没有所需长度的上限,但似乎假设了已知的最大长度,那么这可能有点棘手。1将a声明为char a[6][MAXLEN];,或者2为每个a[i]动态分配至少MAXLEN字节,当您不再需要该空间时,不要忘记释放该空间,或者3将每个a[i]设置为单独声明的足够大的现有数组a[i]=&an_数组[0];的第一个元素的地址;,或者,等价地,a[i]=a_数组;。您已经创建了一个包含六个指针的数组,但指针值从未初始化或赋值。fgets不能做到这一点。相反,它尝试在提供的指针指向的位置写入数据,而在您的情况下,指针指向的位置是不确定的。您需要为文件的每一行分配空间,而不是忽略每一行的字符串终止符的一个字节。如果您没有所需长度的上限,但似乎假设了已知的最大长度,那么这可能有点棘手。1将a声明为char a[6][MAXLEN];,或者2为每个a[i]动态分配至少MAXLEN字节,当您不再需要该空间时,不要忘记释放该空间,或者3将每个a[i]设置为单独声明的足够大的现有数组a[i]=&an_数组[0];的第一个元素的地址;,或者,等价地,a[i]=a_数组;。这句话的措辞有点误导。每个数组元素都有自动分配的内存。但这些元素是指针。为了使它们对OP有用,必须将它们指定给指向FGET最多可写入MAXLEN字节的空间。指针与指向的空间分开且独立于指向的空间似乎是OP困惑的一部分。还要注意的是,指向的空格不一定需要动态分配。现在就同意@JohnBollingerBetter,谢谢。谢谢@JohnBollinger的更正。这有点误导性。每个数组元素都有自动分配的内存。但这些元素是指针。为了使它们对OP有用,必须将它们指定给指向FGET最多可写入MAXLEN字节的空间。指针与指向的空间分开且独立于指向的空间似乎是OP困惑的一部分。还要注意,指向的空格不一定需要动态分配。现在就同意@JohnBollingerBetter,谢谢。谢谢@JohnBollinger的更正。
for (int i = 0; i < 6; i++) {
 a[i] = malloc(MAXLEN); /* you can allocate as per req. */
 fgets(a[i], MAXLEN, fp); /* read manual page of fgets(), it stores \n at end of buffer in some condition, be aware of that */
}