所以,我正在进行这个刽子手游戏。我对数组和指针有点麻烦。这就是我所拥有的:
char* getword(int index);
int main (void) {
char *secword = getword(1);
printf("%s ", *secword);
}
char *getword(int index)
{
char *words[8]= {'bye', 'hi','what', 'cat', 'dog',
'bird', 'air', 'water', 'fire'};
return words[index];
}
我不断收到分段错误(核心转储)错误。
答案 0 :(得分:1)
你有四个重大错误
您不能在words
函数之外使用getword()
,因为它已在函数的堆栈帧中分配。
因此,当函数返回时,数组将被释放,从而发生未定义的行为。
您的数组不包含字符串,而是多字符容器。 多字符常量是有效的,但是是实现定义的,因此您不能依赖它们来实现可移植程序。
您的代码编译是因为您没有启用警告,然后当您尝试访问这些值的地址时,将依赖于多字符常量的实现的整数值分配给数组的poitners。打印它们然后发生未定义的行为。
printf()
期望每个char
说明符都有"%s"
指针,*secword
的类型为char
,因此它也错了,它& #39;再次编译,因为你没有启用编译器警告。
您正在使用9
字而不是8
初始化数组,这是编译器警告报告的另一个问题。
您有2个选项
在words
函数
getword()
静态
const char *getword(int index);
int main (void)
{
char *secword = getword(1);
printf("%s\n", secword);
}
const char *getword(int index)
{
static const char *words[9] = {"bye", "hi", "what", "cat", "dog",
"bird", "air", "water", "fire"
};
return words[index];
}
在main中声明words
,并将其传递给getword()
const char *getword(int index, const char *words[]);
int main (void)
{
const char *words[9] = {"bye", "hi", "what", "cat", "dog",
"bird", "air", "water", "fire"
};
char *secword = getword(1, words);
printf("%s\n", secword);
}
const char *getword(int index, const char *words[])
{
return words[index];
}
我现在已经编写了一段时间的c程序,并且我使用了与我的编译器可以提供的一样多的警告,如果我是一个新的程序员学习c,如果可能的话,我会启用更多的警告。
答案 1 :(得分:0)
char* getword(int index);
int main (void) {
char *secword = getword(1);
printf("%s ", secword);
}
char *getword(int index)
{
static char *words[9]= {"bye", "hi","what", "cat", "dog",
"bird", "air", "water", "fire"};
return words[index];
}
应该是这样的......
答案 2 :(得分:0)
您的计划有几个问题:
使用char*
变量(或任何指针)时,必须始终首先使用malloc分配内存。不要忘记释放它。手动分配内存的替代方法是使用固定大小的数组。
打印时不要取消引用字符串(printf( "%s ", *secword )
)。
确保在声明数组时指定正确数量的元素(有9个,而不是8个),并且不要忘记检查数组边界的步进。
在C中,所有字符串都是双引号;单引号表示字符常量。