c - 遇到段错误错误

标签 c segmentation-fault runtime-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() 之前未初始化,但这无关紧要,因为无论如何 undefined behavior 正在发生发生。该标准指定传递给 scanf() 的任何意外类型的参数都将导致未定义的行为

事实上 a 在调用 scanf() 之前没有被初始化意味着如果你忽略 scanf() 的返回值并且它失败,并且您尝试像在代码中的 printf() 中那样读取 a,您的代码将调用未定义的行为。这就是检查返回值如此重要的原因。

& address of 运算符生成一个包含其操作数地址的指针,scanf() 需要一个指向参数的指针1 以便能够将结果存储在其中。

请注意,当传递一个数组时,例如,一个 char 数组到 scanf() 一个带有 "%s" 说明符的字符串,您不应该使用 & 运算符,因为数组名称被转换为指向其自身第一个元素的指针,这正是 scanf() 在这种情况下所需要的。


1请注意, 中没有引用传递 ,所以这是您可以在 scanf() 函数内更改参数的唯一方法。

关于c - 遇到段错误错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34927803/

相关文章:

c - 将整数指针分配给结构数组并且代码仍然被执行?

将 Julian Date 转换为 Gregorian Date - C 编程

c - 新手编译器问题

c++ - 使用 OMP 进行多个 Eigen::Matrix 初始化:段错误

c - 在不同的目录中打开文件。在 C 中导致段错误?

java - ArrayList 的 IndexOutOfBoundException

python - Ctypes 找不到我加载的 dll 的 dll 依赖项

c++ - tinyxml2 的奇怪段错误

swift - 在 Xcode 模拟器 [swift 3.0] 上启动时屏幕为空白

android - MountEmulatedStorage() Zygote SELinux get_category 在 android studio 中的错误