c - 没有额外的 "printf"我的代码给我段错误(核心转储)错误

标签 c arrays

<分区>

我正在尝试在 Linux 中编写 C 程序。

#include<stdio.h>

void fun(int *r)
{
    *r=20;

     r--;
    *r=30;

     r--;
    *r=40;
}

int main()
{
    int a=2;
    int b=3;
    int c=4;

    fun(&c);

    printf("a=%d\nb=%d\nc=%d",a,b,c);

    return 0;
}

当我运行代码时,它给我一个段错误(核心已转储)。

但是当我在函数调用之前在主函数中打印abc 的地址时,代码就可以工作了。

#include<stdio.h>

void fun(int *r)
{*r=20;

r--;

*r=30;
r--;

*r=40;
}
int main()
{

int a=2;
int b=3;
int c=4;

printf("a=%p\nb=%p\nc=%p\n",&a,&b,&c);

fun(&c);


printf("a=%d\nb=%d\nc=%d",a,b,c);

return 0;
}

谁能告诉我为什么会这样?

最佳答案

在您的代码中,c 是一个单个 变量,您将此变量的地址传递给fun()。稍后,在 fun() 中,您尝试移动指针然后取消引用它。它实际上调用了 undefined behavior .

只有数组元素才能保证分配到连续的内存位置,单独的变量可以很好地以依赖于编译器的方式分配。

你可以像这样定义一个数组

 int a[3] = {0};

然后,像这样调用fun()

 fun(&a[2]);

并以明确定义的方式获得期望的结果。

关于c - 没有额外的 "printf"我的代码给我段错误(核心转储)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36084455/

相关文章:

python - 减少数组上 python 问题的嵌套循环

c - 数组中最低的 n 个数字

ios - Swift 将不同类型组合成一个数组来为 UITableView 显示数据

c - 如何为 `system()` 调用的命令提供参数?

c - 为什么它给出错误“在 Microsoft Visual 中找不到获取标识符”?

c - c中两个数相加

c - 字数统计程序未检测到文本文件中的双新行

c - 从 C 中的文件读取(可变长度)输入

c - 字符串到整数

java - 顺序搜索方法中的错误