将指针作为参数传递给C中的函数

时间:2012-02-27 00:50:18

标签: c pointers

我偶然发现了一些令我惊讶的事情。 为什么这样做?

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;
}

是用语言定义的还是实现问题?

2 个答案:

答案 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