我有一个以
开头的功能void findErrors(int lineIndex){
char *line;
strcpy(line, lines[lineIndex]);
然后调用另一个以
开头的函数void fixErrors(int lineIndex, char *word){
char *line;
strcpy(line, lines[lineIndex]);
第一个函数有效,但是当它调用第二个函数时我得到一个段错误。对于这两个单词,lineIndex是相同的,并且除strcpy()外,findErrors不会调用lines数组。为什么会这样?这是一个使用该功能的坏方法,我只是在第一个功能上获得幸运吗?如果我从
更改fixErrors中的行,问题就会消失char *line;
到
char line[255];
但我宁愿没有可能在一条巨大的线路上发生另一次段错误。我想我也可以
char *line = malloc(strlen(lines[lineIndex])+1)
但我真的好奇为什么第一种方式不起作用。
答案 0 :(得分:0)
void findErrors(int lineIndex){
char *line;
strcpy(line, lines[lineIndex]);
//^ this is undefined behaviour.
此时line
未初始化并且将某些内容绑定到非初始化指针会导致未定义的行为,通常是段错误。
但是如果偶然line
指向一些有效的内存,程序可能不会崩溃,看起来好像有效。这是未定义的行为。
工作原理:
void findErrors(int lineIndex){
char line[255];
strcpy(line, lines[lineIndex]);
此处line
指向长度为255的缓冲区。只要源字符串的长度小于254,您就可以strcpy
到此缓冲区而不会出现问题。
为什么"小于254"而不是255?
因为我们需要为零终止符添加一个char。