我正在运行以下C代码。
void manual_enter(int * state_count, char * states, char * alphabet, char * start_state, char * accept_states) {
int counter;
printf("Please enter the number of states in the DFA. ");
scanf("%d", state_count);
states = (char *) malloc(sizeof(char) * (*state_count) );
printf("n!");
counter = 0;
for(counter = 0; counter < *state_count; counter++) {
printf("n!");
printf("nPlease enter state: %d", counter);
scanf("%c", states[counter]);
printf("%c", states[counter]);
}
return;
}
我在第二个感叹号之后但在提示输入给定状态号之前收到段错误。我在 gdb 中运行以获取回溯,这就是我得到的:
(gdb) bt
#0 0x00007fff8b313fda in ?? () from /usr/lib/system/libsystem_platform.dylib
#1 0x00007fff5fbff360 in ?? ()
#2 0x00007fff88db1fbb in __fread () from /usr/lib/system/libsystem_c.dylib
Backtrace stopped: frame did not save the PC
我是一个编程新手,所以很可能我正在接近这个调试,这一切都是错误的。有关如何解决此问题的任何帮助或提示将不胜感激。谢谢!
对应于scanf()
中%c
的参数必须是指针:
scanf(" %c", &states[counter]);
您应该已经收到有关此的编译器警告。
您还应该在%c
之前放置一个空格,以便在读取字符之前跳过空格。否则,每隔state
将包含一个换行符。
我想知道为什么当函数将其作为参数接收时,您为什么要分配states
。如果函数应该分配states
数组本身并将其返回给调用方(就像它对 char **states' 所做的state_count), the argument should be
一样。然后你会做:
*states = malloc(sizeof(char) * (*state_count));
函数中对states
的所有其他引用也需要更改为 *states
。