C语言关于fgets()函数和指针数组的问题

我在使用指针数组的时候碰到了问题,用fgets()函数无法往相应地址指向的内存放字符串。
首先我定义了一个头文件和一个源文件来写函数,如下面两张图所示:

img

img

函数的前两个参数分别为路径名和文件名,在函数里组合成为绝对路径供函数fopen()使用,第三个参数为指针数组。
按我的想法,fgets(inhalte[zaehler],Line_Max,fp) 应该将读取到的字符串储存在inhalte[zaehler]所指向的内存,但是我发现main函数里的while循环并没有执行,不知道是什么原因。main函数和运行结果如下:

img

img

以下答案由GPT-4.0Plus大模型与博主A努力中.......共同编写:
fgets()函数读取字符串后,并没有真正将字符串存储在inhalte[zaehler]指向的内存中。
fgets()函数的原型是:
char *fgets(char *str, int n, FILE *stream);
它的作用是:从stream中读取n-1个字符,并将其存储在str指向的内存中。
但在您的代码中,str参数传入的是inhalte[zaehler],这是一个指针,并不是真正的内存块。
fgets()无法将读取的字符串存储在一个指针本身,它需要一个真实的、可写的内存块。
所以,正确的用法应该是:

  1. 首先为指针数组的每个元素分配内存:
c
char *inhalte[100];
for (int i=0; i<100; i++) {
    inhalte[i] = (char *) malloc(Line_Max*sizeof(char)); 
}

  1. 然后将这些内存块的地址存入指针数组:
c
inhalte[0] = 第一块内存的地址;
inhalte[1] = 第二块内存的地址;

...

  1. 当调用fgets()时,传入这些内存块的地址,fgets()就可以将读取的字符串存储在相应的内存中:
c 
fgets(inhalte[0], Line_Max, fp);  // 存储在第一块内存中
fgets(inhalte[1], Line_Max, fp);  // 存储在第二块内存中

...
4. 通过指针数组的元素 access 这些内存块。
所以,总结下您的代码应该修改为:

  1. 为指针数组的每个元素分配内存
  2. 将内存块地址存入指针数组
  3. 将内存块地址作为fgets()的参数,读取字符串
  4. 访问指针数组的元素,得到内存块中的字符串

你都没给p分配内存呀
实参没分配内存,那么形参得到的也是个野指针
你往野指针里写字符串,肯定写不进去呀