使用mallloc每隔三分钟运行我的程序进行分段错误

Mat*_*ewN 1 c pointers realloc dynamic-memory-allocation

我几乎每隔三次就会遇到一个分段错误,我正在努力理解为什么.我认为它的原因是使用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] = '\0'; 

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

    return buffer;
}
Run Code Online (Sandbox Code Playgroud)

我不确定我的错误在哪里或错误发生的原因.以下是我如何调用该函数:

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

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

    free(*input);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Sou*_*osh 5

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

 buffer[length] = user_input;
Run Code Online (Sandbox Code Playgroud)

正在访问无效的内存地址.这会调用未定义的行为.

您必须显式初始化lengthto 0.

在那之后,知道getchar()返回一个int,并且一个像EOF不能适合的值char.您需要更改user_inputint.

此外,在main(),你已经定义input为一个指针,

char* input = Input();
Run Code Online (Sandbox Code Playgroud)

但是,你将它与一个int值进行比较,这很可能不是你想要的.

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

if (*input == 1)
    return 1;
if (*input == 2)
    return 2;
Run Code Online (Sandbox Code Playgroud)

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

 free(*input);
Run Code Online (Sandbox Code Playgroud)

 free(input);
Run Code Online (Sandbox Code Playgroud)