给函数一个结构指针时的段错误
Segfault when giving a function a struct pointer
我有一个看起来像这样的函数:
int lexWhitespace(TokenizerOutput* input) {
printf("he");
if (!(14 > input->toStillParse[0] > 8) && !(input->toStillParse[0] == 32)) {
// checks if the first character in the toStillParse section of input is whitespace.
return -1;
} else {input->tokenizerOutput[0] = input->toStillParse[0];}
for (int i = 1; ; i++) {
if ((14 > input->toStillParse[0] > 8) || (input->toStillParse[0] == 32)) {
// checks if the first character in the toStillParse section of input is whitespace.
input->tokenizerOutput[i] = input->toStillParse[i];
} else {return 0;}
}
}
接受这个结构:
struct TokenizerOutput {
const char* toStillParse; // holds the text that still needs to be parsed.
char* tokenizerOutput; // holds the text that was just output by tokenizer function.
};
typedef struct TokenizerOutput TokenizerOutput;
当我尝试在主函数中这样调用它时:
int main(void) {
printf("hello\n");
TokenizerOutput j = {" k", " "};
printf("%s\n", (&j)->toStillParse);
lexWhitespace(&j);
return 0;
}
我遇到段错误。段错误发生在函数 lexWhitespace 甚至运行任何东西之前,因为它不打印“he”。我不知道为什么会这样。任何帮助将不胜感激。我正在使用 gcc 9.3.0.
此代码中存在一些错误。
首先这个条件:
14 > input->toStillParse[0] > 8
这可能是无意的。大概意思是写成:
14 > input->toStillParse[0] && input->toStillParse[0] > 8
其次,这个循环可能永远不会终止:
for (int i = 1; ; i++) {
if ((14 > input->toStillParse[0] > 8) || (input->toStillParse[0] == 32)) {
// checks if the first character in the toStillParse section of input is whitespace.
input->tokenizerOutput[i] = input->toStillParse[i];
} else {return 0;}
}
请注意,被比较的字符 toStillParse[0]
在每次循环迭代中都是相同的字符。所以这个循环要么立即退出,要么永远循环(并且可能崩溃/段错误)。看起来 [0]
应该是 [i]
。还要注意条件可能写错了。
在 C 中,x > y > z
与 x > y && y > z
不同。每当你看到 x > y > z
时,它可能是错误的(除非你正在查看 IOCCC 条目或其他内容)。
我有一个看起来像这样的函数:
int lexWhitespace(TokenizerOutput* input) {
printf("he");
if (!(14 > input->toStillParse[0] > 8) && !(input->toStillParse[0] == 32)) {
// checks if the first character in the toStillParse section of input is whitespace.
return -1;
} else {input->tokenizerOutput[0] = input->toStillParse[0];}
for (int i = 1; ; i++) {
if ((14 > input->toStillParse[0] > 8) || (input->toStillParse[0] == 32)) {
// checks if the first character in the toStillParse section of input is whitespace.
input->tokenizerOutput[i] = input->toStillParse[i];
} else {return 0;}
}
}
接受这个结构:
struct TokenizerOutput {
const char* toStillParse; // holds the text that still needs to be parsed.
char* tokenizerOutput; // holds the text that was just output by tokenizer function.
};
typedef struct TokenizerOutput TokenizerOutput;
当我尝试在主函数中这样调用它时:
int main(void) {
printf("hello\n");
TokenizerOutput j = {" k", " "};
printf("%s\n", (&j)->toStillParse);
lexWhitespace(&j);
return 0;
}
我遇到段错误。段错误发生在函数 lexWhitespace 甚至运行任何东西之前,因为它不打印“he”。我不知道为什么会这样。任何帮助将不胜感激。我正在使用 gcc 9.3.0.
此代码中存在一些错误。
首先这个条件:
14 > input->toStillParse[0] > 8
这可能是无意的。大概意思是写成:
14 > input->toStillParse[0] && input->toStillParse[0] > 8
其次,这个循环可能永远不会终止:
for (int i = 1; ; i++) {
if ((14 > input->toStillParse[0] > 8) || (input->toStillParse[0] == 32)) {
// checks if the first character in the toStillParse section of input is whitespace.
input->tokenizerOutput[i] = input->toStillParse[i];
} else {return 0;}
}
请注意,被比较的字符 toStillParse[0]
在每次循环迭代中都是相同的字符。所以这个循环要么立即退出,要么永远循环(并且可能崩溃/段错误)。看起来 [0]
应该是 [i]
。还要注意条件可能写错了。
在 C 中,x > y > z
与 x > y && y > z
不同。每当你看到 x > y > z
时,它可能是错误的(除非你正在查看 IOCCC 条目或其他内容)。