我的程序每三分之一出现一次分段错误 运行,使用 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;
我几乎每三次都会遇到分段错误,我正在尝试了解原因。我认为它的原因是使用 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;