void foo (int* a)
{
int x = 3;
*a = x;
}
int main()
{
int a;
foo(&a);
return 0;
}
但是这会导致分段错误(在Visual Studio 2008和gcc上都有?)
void foo (int* a)
{
int x = 3;
*a = x;
}
int main()
{
int* a;
foo(a);
return 0;
}
是用语言定义的还是实现问题?
答案 0 :(得分:4)
宣布
时int* a;
你正在声明一个指针变量a
,但你并没有指出任何东西。然后在函数中,你做
*a = x;
取消引用指针并尝试将其指向x
的值。但由于它没有指向任何东西,因此会出现未定义的行为,表现为分段错误。
你应该这样做:
int i; // the actual integer variable
int* a = &i; // a points to i
它与第一个之间的区别在于int a;
声明了一个真正的整数变量,然后用&a
取其地址并将其传递给函数。函数a
内的指针foo
指向a
中的变量main
,因此取消引用它并分配给它是完全正常的。
答案 1 :(得分:2)
int a;
一旦声明就分配内存,但不是int * a;
的情况int *a;
是指针声明(MEMORY尚未为此分配)。
int *a = (int*)malloc(sizeof(int)); // allocate memory