【发布时间】:2017-06-02 03:56:52
【问题描述】:
我正在用 C 语言编写一个函数来从字符串 (*s) 中获取下一个单词并将其复制到缓冲区 (*w) 中。它返回单词的第一个字符。
当输入字符串是 char 指针 (char *text) 时它工作正常,但是当我将类型更改为 char 数组 (char [MAXTEXT]) 时程序崩溃。
这让我很困惑,因为我认为编译器无论如何都会将 char 数组“衰减”为 char 指针。在我看来,输入是 char 指针还是 char 数组应该没有区别?
(声明在第10行char *text = "This should return the first word";,更改为char text[MAXTEXT] = "This should return the first word";时崩溃)
#include <stdio.h>
#include <ctype.h>
#define MAXTEXT 1000
int getword(char *inp, char *out, int lim);
void main()
{
char *text = "This should return the first word";
char *word;
int i, c;
printf("%c", getword(text, word, MAXTEXT));
printf("%s", word);
}
int getword(char *s, char *w, int lim)
{
static int bufp = 0;
char c;
char *word = w;
while (isspace(c = s[bufp++]));
if (c != EOF)
*w++ = c;
else if (!isalpha(c))
{
*w = '\0';
return c;
};
for (; --lim > 0; bufp++)
if (isalpha(c = s[bufp]) || c == '\'')
*w++ = s[bufp];
else
break;
*w = '\0';
return word[0];
}
【问题讨论】:
-
当你将
word声明为指针时,它指向哪里? -
还没有?当我设置声明时,我不是简单地为指向 char 的指针的初始化留出内存吗?初始化发生在 getword() 函数内部。
-
另外,除非您明确地将
EOF放入text缓冲区,否则它将永远不会包含具有该值的字符。如果你这样做了,那么你就会遇到EOF是int而不是字符的问题,并且(char)EOF != EOF有可能(这取决于char是否为@ 987654331@ 与否,这是特定于编译器的)。标准 I/O 字符函数返回int而不是char是有原因的。 -
关于
word,你永远不会让它指向anywhere,这意味着它的值将是indeterminate,当你取消引用它时,你会得到未定义的行为。谁知道你会在哪里写角色?要么把它变成一个数组,要么为它动态分配内存。 -
未定义的行为是未定义的。它可能看起来“有效”,直到它不起作用。