#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void read_slogan(FILE *fp, char **slogan)
{
char buf[1024];
int i;
for (i = 0; i < 7; i++) {
fgets(buf, 1024, fp);
/*删除换行字符*/
buf[strlen(buf)-1] = '\0';
/*分配保存一个标语的内存空间*/
slogan[i] = malloc(sizeof(char) * (strlen(buf) + 1));
/*复制标语的内容*/
strcpy(slogan[i], buf);
}
}
int main(void)
{
char *slogan[7];
int i;
read_slogan(stdin, slogan);
/*输出读取的标语*/
for (i = 0; i < 7; i++) {
printf("%s\n", slogan[i]);
}
return 0;
}
这段代码来自《征服C指针》第四章4.2节4.2.1小节4-5代码清单。从网上找的电子版《征服C指针》在这一块有些错误。我看的那版电子版的《征服C指针》关于read_slogan写的是void read_slogan(FILE fp, char *slogan),这里的形参定义让我迷惑了好一阵。后来看了书才发现电子版的书有错误。本来指针对新手来说就不太好理解,看了这本有错误的电子版《征服C指针》搞得我更糊涂了。这里就来分析一下void read_slogan(FILE fp, char *slogan)中char *slogan为什么不对。
这段代码是在被调用函数read_slogan中分配内存并得到内存地址,然后通过被调用函数read_slogan把这块区域返回给主调用函数main。在被调用函数read_slogan中分配的是字符数组,要分配7个字符数组,用for循环表示的,每一次循环分配一个字符数组,并返回这个字符数组的地址。字符数组的地址是一级指针。我们要把这7个一级指针返回给主调函数main,就需要在main函数中定义7个变量,由于这7个变量存放7个一级指针,而变量的级数是由他存放的内容的级数决定的,因此在main函数中要分配7个一级指针,也就是一个有7个元素的指针数组 char *slogan[7];,数组的每一个元素存放一个一级指针。又因为是从被调用函数中去给这个数组赋值,所以需要将这个数组 char *slogan[7]的地址传给被调用函数read_slogan。由于数组存放的是一级指针,那么数组的地址就是二级指针。所以read_slogan的形参应该定义为二级指针,而不是错误的电子书上写的那样是一个一级指针形参。
这里的分析可以查看我的上一篇博客https://mp.csdn.net/postedit/90896587