说我有一个变量
int * foo;
我将此变量传递给
func(int *x)
{
*x = bar;
}
然而,这不起作用。但是,如果我放一个非指针(比如把它更改为 int foo; )并直接输入地址,这就行了。
为什么我的第一个案例不起作用?
谢谢!
答案 0 :(得分:3)
您的代码正在完成您所说的内容。但是,int *foo
不分配任何存储空间。指针只是内存地址的句柄。在这种情况下,它是任意的并导致未定义的行为。请尝试以下方法。
void func(int *x) {
*x = 42;
}
int main(int argc, char** argv) {
int *foo;
int storage;
foo = &storage;
func(foo);
printf("%d\n" storage);
return 0;
}
foo
只是指向storage
的指针,它由运行时分配在堆栈上。在这种情况下,你也可以使用foo(&storage)
。
答案 1 :(得分:1)
通过声明int * foo,你只创建了一个指针。 foo实际上并没有指向任何东西 - 它没有被初始化。您甚至可能会从这样的代码中获得分段错误,因为指针可能指向程序存储器之外。如果你这样做:
int * foo = (int *)malloc(sizeof(int));
你将初始化指针,malloc从传递给它的大小的堆中分配一些内存。你也可以这样做:
int bar = 0;
int * foo = &bar;
这将使foo成为指向bar的指针(&返回变量的地址)。
答案 2 :(得分:0)
你应该做这样的事情
int bar = 235; // any value you want
void func(int *x)
{
*x = bar;
}
int main()
{
int *foo;
foo = (int*)malloc(sizeof(int));
func(foo);
printf("%d", *foo);
free(foo);
return 0;
}