在C语言中访问字符指针数组内容的问题

在C语言中访问字符指针数组内容的问题,c,arrays,pointers,C,Arrays,Pointers,我正在学习K&R的C编程语言,并试图理解字符指针和数组 我正在用C创建一个函数,它从stdin中读取多行,并将行(char*)存储在字符指针数组中(char*[]) #包括 #包括 #包括 枚举{MAXINPUT=1024,MAXLINES=100}; /*最多读取'maxLines'行,并将它们存储在字符指针数组中。返回读取的行数*/ int readlines(char*lineptr[],int maxLines); /*从stdin获取单行输入并将其存储在str中。返回str长度*/ i

我正在学习K&R的C编程语言,并试图理解字符指针和数组

我正在用C创建一个函数,它从stdin中读取多行,并将行(
char*
)存储在字符指针数组中(
char*[]

#包括
#包括
#包括
枚举{MAXINPUT=1024,MAXLINES=100};
/*最多读取'maxLines'行,并将它们存储在字符指针数组中。返回读取的行数*/
int readlines(char*lineptr[],int maxLines);
/*从stdin获取单行输入并将其存储在str中。返回str长度*/
int getInputLine(char*str,int maxInput);
int main(int argc,char**argv){…}
int readlines(char*lineptr[],int maxLines){
/*返回读取的行数*/
int numLines=0;
/*用于存储正在读取的当前行的缓冲区*/
字符currentLine[MAXINPUT];
/*在输入为空或行数超过最大值时按enter键终止循环*/
while(getInputLine(currentLine,MAXINPUT)和&numLines
我的问题是在
while()
中,
lineptr
currentLine
的内容打印准确。但是在
while()
之外,
lineptr
currentLine
都不打印任何内容

当然,当我尝试在
main()
中将行读入
char*[]
并尝试打印其内容时,这个问题仍然存在


为什么
lineptr
访问的地址上的内容打印在循环内部而不是外部?我遗漏了一些明显的东西吗?

这是因为您有一个名为
currentLine
的缓冲区,您可以在其中读取文本。然后将
currentLine
的地址分配给
lineptr[i]
,并继续用新文本覆盖其内容。因此,所有
lineptr
基本上都指向同一个位置,即
currentLine
的地址,并且
currentLine
仅包含您读取的最后一行。我想循环不会打印任何内容,因为您读取的最后一行是空的


因此,要使其工作,需要将一行读入
currentLine
,测量其长度,使用
malloc()
为该行分配足够的内存,将该行从
currentLine
复制到分配的内存中,并将指向分配内存的指针存储在
lineptr[i]

这是因为您有一个名为
currentLine
的缓冲区,可以在其中读取文本。然后将
currentLine
的地址分配给
lineptr[i]
,并继续用新文本覆盖其内容。因此,所有
lineptr
基本上都指向同一个位置,即
currentLine
的地址,并且
currentLine
仅包含您读取的最后一行。我想循环不会打印任何内容,因为您读取的最后一行是空的


因此,要使其工作,需要将一行读入
currentLine
,测量其长度,使用
malloc()
为该行分配足够的内存,将该行从
currentLine
复制到分配的内存中,并将指向分配内存的指针存储在
lineptr[i]

这是因为您有一个名为
currentLine
的缓冲区,可以在其中读取文本。然后将
currentLine
的地址分配给
lineptr[i]
,并继续用新文本覆盖其内容。因此,所有
lineptr
基本上都指向同一个位置,即
currentLine
的地址,并且
currentLine
仅包含您读取的最后一行。我想循环不会打印任何内容,因为您读取的最后一行是空的


因此,要使其工作,需要将一行读入
currentLine
,测量其长度,使用
malloc()
为该行分配足够的内存,将该行从
currentLine
复制到分配的内存中,并将指向分配内存的指针存储在
lineptr[i]

这是因为您有一个名为
currentLine
的缓冲区,可以在其中读取文本。然后将
currentLine
的地址分配给
lineptr[i]
,并继续用新文本覆盖其内容。因此,所有
lineptr
基本上都指向同一个位置,即
currentLine
的地址,并且
currentLine
仅包含您读取的最后一行。我想循环不会打印任何内容,因为您读取的最后一行是空的

因此,要使其正常工作,您需要将一行读入
currentLine
,测量其长度,使用
malloc()
为该行分配足够的内存,将该行从
currentLine
复制到分配的内存中,并将指向分配内存的指针存储在
lineptr[i]
此行中

    lineptr[numLines] = currentLine;
只需将指针指定给
lineptr[numLines]
。这有两个问题:

  • 每条线都指向s
        lineptr[numLines] = currentLine;
    
        lineptr[numLines] = strdup(currentLine);
    
    char* strdup(char const* in)
    {
        char* ret = malloc(strlen(in)+1);
        return strcpy(ret, in);
    }