我正在尝试在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函数中打印a
,b
和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;
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;
}
有人可以告诉我为什么会这样吗?
答案 0 :(得分:3)
在您的代码中,c
是单个变量,您将此变量的地址传递给fun()
。稍后,在fun()
内,您尝试移动指针,然后取消引用它。它实际上调用了undefined behavior。
只保证数组元素被分配连续的内存位置,单独的变量很可能以编译器相关的方式分配。
您可以定义类似
的数组 int a[3] = {0};
然后,像{/ p>一样调用fun()
fun(&a[2]);
以明确定义的方式获得所需的结果。
答案 1 :(得分:2)
它可能与编译器应用(或不是)的任何优化有关。这肯定不是可移植的代码。如果它完全有效,那只是运气,因为C不保证变量的分配顺序。该程序似乎取决于未定义的行为。