我只是在程序中发生段错误。当我运行下面的代码(简化)时,for循环中的printf可以完全正常工作,但随后通过第二个printf调用进行段错误。有什么问题的想法吗?谢谢。
int done = 0;
char *string = malloc (sizeof (char) * 10);
char** prompts = malloc(sizeof(char*) * 10);
for(int i = 0 ; i < 10; i++) prompts[i] = malloc(sizeof(char) * 10);
prompts[0] = "prompt1> ";
prompts[1] = "prompt2> ";
prompts[2] = "prompt3> ";
prompts[3] = "prompt4> ";
for (int i = 0; i < 4; i++) {
do {
char *line;
int number;
printf("%s", prompts[i]);
read_line(stdin, &line, 0);
if (sscanf(line, "%d", &number) != 1) continue;
if (number < 0) continue;
if (count <= number) continue;
else {
done = 1;
string[i] = number + '0';
printf("%c\n", string[i]);
}
} while(!done);
done = 0;
}
printf("string %c\n", string[0]);
for(int i = 0;i < 10;i++) free(prompts[i]);
free(prompts);
return string;
答案 0 :(得分:0)
代码很奇怪。动态分配prompts
是毫无意义的,而大小是一个常数,只需编写以下代码:
char *prompts[] = {
"prompt1> ",
"prompt2> ",
"prompt3> ",
"prompt4> "
};
否,这里不需要malloc
或free
。
但是您可以使其更简单,一起删除prompts
指针并编写:
for (int i = 0; i < 4; i++) {
do {
char *line;
int number;
printf("prompt%d> ", i + 1);
...
我也建议您替换
char *string = malloc (sizeof (char) * 10);
使用
char *string = calloc(10, sizeof (char));
这会将分配的内存初始化为零,因此您的string
将自动NUL终止。
有了这些,您的大多数问题都将消失。
我建议您阅读C课本中有关字符串的章节和有关指针的章节。