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)
我看到的主要问题是,在您的Input()函数代码中,length是一个具有自动存储持续时间且未显式初始化的局部变量.因此,它包含不确定的价值.因此,声明
buffer[length] = user_input;
Run Code Online (Sandbox Code Playgroud)
正在访问无效的内存地址.这会调用未定义的行为.
您必须显式初始化lengthto 0.
在那之后,知道getchar()返回一个int,并且一个像EOF不能适合的值char.您需要更改user_input为int.
此外,在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)