【发布时间】:2013-09-29 02:23:33
【问题描述】:
我想制作一个列表,例如10 通过键盘输入的句子。为了得到一条线,我使用了一个函数getline()。谁能解释为什么这个程序在进入第二行时会崩溃?哪里错了?
#define LISTMAX 100
#define LINEMAX 100
#include <stdio.h>
#include <string.h>
void getline(char *);
int main ()
{
char w[LINEMAX], *list[LISTMAX];
int i;
for(i = 0; i < 10; i++)
{
getline(w);
strcpy(list[i], w);
}
for(i = 0; i < 10; i++)
printf("%s\n", list[i]);
return 0;
}
void getline(char *word)
{
while((*word++ = getchar()) != '\n');
*word = '\0';
}
【问题讨论】:
-
因为
strcpy(list[i], w);正在将数据复制到不确定的目标地址。您永远不会为副本的目标分配内存。list[]充满了不确定的地址值,因此我们进入了未定义的行为。 -
你可能想看看
strndup()。 -
您可能还想考虑将一个上限传递给您的
getline(),或者使用全局LINEMAX和一个计数器。正如所写,只要您输入 100 个字符或更长的字符串(包括换行符),它就会触发未定义的行为。 -
@cdhowie: strndup() 不是标准的,所以 OP 的里程可能会有所不同。
-
@AndyG 取决于您对“标准”的定义。它是 POSIX 2008 的一部分。
标签: c arrays string function pointers