我的程序每三分之一出现一次分段错误 运行,使用 malloc

Segmentation fault every third running my program, using mallloc

我几乎每三次都会遇到分段错误,我正在尝试了解原因。我认为它的原因是使用 malloc()free() 错误。我必须读取用户标准输入,然后使用 malloc 将其保存在数组中。这部分一直在工作,直到错误开始发生。

我的代码:

char *Input() {
    char user_input;
    int length;

    char *buffer = malloc(2 * sizeof(char));

    while (((user_input = getchar(stdin)) != EOF) && (user_input != '\n')) {
        buffer[length] = user_input;
        length++;
        char *buffer_new = realloc(buffer, length + 2);
        if (buffer_new != NULL) {
            buffer = buffer_new;
        } else {
            free(buffer);
            printf("Error.\n");
            return 1;
        }
    }

    buffer[length] = '[=11=]'; 

    if (strlen(buffer) > 200) {
        printf("Error.\n");
        return 2;
    }

    return buffer;
}

我不太确定我的错误在哪里或为什么会发生错误。以下是我调用该函数的方式:

int main() {
    char *input = Input();

    if (input == 1)
        return 1;
    if (input == 2)
        return 2;

    free(*input);

    return 0;
}

我看到的主要问题是,在您的 Input() 函数代码中,length 是一个具有自动存储持续时间且未明确初始化的局部变量。因此,它包含不确定的值。因此,声明

 buffer[length] = user_input;

正在访问无效的内存地址。这会调用 undefined behavior.

您必须明确地将 length 初始化为 0

之后,知道 getchar() returns an int,像 EOF 这样的值不能放入 char。您需要将 user_input 更改为 int

此外,在 main() 中,您已将 input 定义为指针,

char* input = Input();

但是,您将其与 int 值进行比较,这很可能不是您想要的。

您应该与存储在指针中的值进行比较,例如

if (*input == 1)
    return 1;
if (*input == 2)
    return 2;

最后,你将指针传递给free(),而不是内容,所以改变

 free(*input);

 free(input);

您没有为length赋值,可以是任何值。如果幸运的话,使用 buffer[length] 时不会溢出,但不要指望运气。初始化它。 int length = 0;