没有额外的“printf”我的代码给我分段错误(核心转储)错误

时间:2016-03-18 12:29:36

标签: 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;
}

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

但是当我在函数调用之前在main函数中打印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;
}

有人可以告诉我为什么会这样吗?

2 个答案:

答案 0 :(得分:3)

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

只保证数组元素被分配连续的内存位置,单独的变量很可能以编译器相关的方式分配。

您可以定义类似

的数组
 int a[3] = {0};

然后,像{/ p>一样调用fun()

 fun(&a[2]);

以明确定义的方式获得所需的结果。

答案 1 :(得分:2)

它可能与编译器应用(或不是)的任何优化有关。这肯定不是可移植的代码。如果它完全有效,那只是运气,因为C不保证变量的分配顺序。该程序似乎取决于未定义的行为。