在for循环外访问char数组时出现分段错误

时间:2018-10-24 14:48:26

标签: c segmentation-fault malloc

我只是在程序中发生段错误。当我运行下面的代码(简化)时,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;

1 个答案:

答案 0 :(得分:0)

代码很奇怪。动态分配prompts是毫无意义的,而大小是一个常数,只需编写以下代码:

  char *prompts[] = {
    "prompt1> ",
    "prompt2> ",
    "prompt3> ",
    "prompt4> "
  };

否,这里不需要mallocfree

但是您可以使其更简单,一起删除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课本中有关字符串的章节和有关指针的章节。