遇到分段错误错误
Got stuck with Segmentation Fault Error
我正在 c
中编写一个简单的程序,但遇到了这个错误
Segmentation Fault (Core dumped)
我知道 Segmentation fault
由于内存访问冲突而发生错误。
但是我无法弄清楚下面简单程序中发生错误内存访问的位置。
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d", a);
printf("%d\n", a);
return(0);
}
我正在在线编译here,在代码块中也出现同样的错误。
您必须将指针传递给 int
而不是 int
本身。改成
if (scanf("%d", &a) == 1)
printf("%d\n", a);
else
printf("Invalid input\n");
在您的代码中,scanf()
假设 int
中的值是它必须写入的地址,从而导致 未定义的行为 。此外,未定义行为的另一个原因是 a
在调用 scanf()
之前未初始化,但这无关紧要,因为无论如何 未定义行为 都会发生。该标准指定传递给 scanf()
的任何意外类型的参数都将导致 未定义的行为 。
事实上 a
在调用 scanf()
之前没有被初始化意味着如果你忽略了 scanf()
的 return 值并且它失败了,并且你尝试读取a
就像您代码中的 printf()
一样,您的代码将调用 未定义的行为 。这就是检查 return 值如此重要的原因。
&
address of 运算符生成一个包含其操作数地址的指针,scanf()
需要一个指向参数的指针 1 以便能够将结果存储在其中。
请注意,当将数组(例如 char
数组传递给 scanf()
带有 "%s"
说明符的字符串时,不应使用 &
运算符,因为数组名称被转换为指向其自身第一个元素的指针,这正是 scanf()
在这种情况下所需要的。
1注意,c中没有引用传递,所以这是您可以在 scanf()
函数中更改参数的唯一方法。
改变
scanf("%d", a);
到
scanf("%d", &a);
scanf 需要指向变量的 指针 ,而不是变量的 值 。
我建议你在编译时添加-Wall
选项。
在你的情况下,gcc 会警告你:
test.c: In function ‘main’:
test.c:25:5: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘int’ [-Wformat=]
scanf("%d", a);
^
我正在 c
中编写一个简单的程序,但遇到了这个错误
Segmentation Fault (Core dumped)
我知道 Segmentation fault
由于内存访问冲突而发生错误。
但是我无法弄清楚下面简单程序中发生错误内存访问的位置。
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d", a);
printf("%d\n", a);
return(0);
}
我正在在线编译here,在代码块中也出现同样的错误。
您必须将指针传递给 int
而不是 int
本身。改成
if (scanf("%d", &a) == 1)
printf("%d\n", a);
else
printf("Invalid input\n");
在您的代码中,scanf()
假设 int
中的值是它必须写入的地址,从而导致 未定义的行为 。此外,未定义行为的另一个原因是 a
在调用 scanf()
之前未初始化,但这无关紧要,因为无论如何 未定义行为 都会发生。该标准指定传递给 scanf()
的任何意外类型的参数都将导致 未定义的行为 。
事实上 a
在调用 scanf()
之前没有被初始化意味着如果你忽略了 scanf()
的 return 值并且它失败了,并且你尝试读取a
就像您代码中的 printf()
一样,您的代码将调用 未定义的行为 。这就是检查 return 值如此重要的原因。
&
address of 运算符生成一个包含其操作数地址的指针,scanf()
需要一个指向参数的指针 1 以便能够将结果存储在其中。
请注意,当将数组(例如 char
数组传递给 scanf()
带有 "%s"
说明符的字符串时,不应使用 &
运算符,因为数组名称被转换为指向其自身第一个元素的指针,这正是 scanf()
在这种情况下所需要的。
1注意,c中没有引用传递,所以这是您可以在 scanf()
函数中更改参数的唯一方法。
改变
scanf("%d", a);
到
scanf("%d", &a);
scanf 需要指向变量的 指针 ,而不是变量的 值 。
我建议你在编译时添加-Wall
选项。
在你的情况下,gcc 会警告你:
test.c: In function ‘main’:
test.c:25:5: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘int’ [-Wformat=]
scanf("%d", a);
^