2012-02-27 125 views
1

我偶然发现的东西让我感到惊奇。 这为什么有效?将一个指针作为参数传递给C中的一个函数

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

您应该在第二个示例中收到警告。 – Mysticial 2012-02-27 00:52:39

回答

4

当你声明

int* a; 

您声明变量a一个指针,但你没有把它指向任何东西。然后在功能,你做

*a = x; 

其中取消引用指针,并试图赋予它指向的x值。但是由于它没有指向任何东西,你会得到未定义的行为,表现为分段错误。

你应该这样做:

int i; // the actual integer variable 
int* a = &i; // a points to i 

说,第一个之间的区别是,int a;声明了一个真正的整型变量,然后你把它的地址与&a并把它传递给函数。函数foo内的指针a指向main中的变量a,因此解引用它并将其分配给它非常好。

+1

也有问题:'printf(“%d \ n”,a);',因为''%d“'期望int类型,但'a'类型为'int *'。 – 2012-02-27 00:56:32

+0

@ChrisLutz明白了,谢谢。 – 2012-02-27 00:58:51

+0

谢谢。即使没有printf,分段错误也会发生,所以我把它从问题 – 2012-02-27 01:02:53

2
int a; 

只要你声明它就分配内存,但这不是int * a;

int *a; 

是指针声明(MEMORY尚未分配给它)。

int *a = (int*)malloc(sizeof(int)); // allocate memory 
相关问题