说我有一个变量
int * foo;
我将此变量传递给
func(int *x)
{
*x = bar;
}
但是,这不起作用。但是,如果我放置一个非指针(比如将其更改为int foo;)并直接放入地址,则此方法有效。
为什么我的第一个案例不起作用?
谢谢!
说我有一个变量
int * foo;
我将此变量传递给
func(int *x)
{
*x = bar;
}
但是,这不起作用。但是,如果我放置一个非指针(比如将其更改为int foo;)并直接放入地址,则此方法有效。
为什么我的第一个案例不起作用?
谢谢!
您的代码也完全按照您所说的去做。但是,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)
在这种情况下,您也可以使用。
通过声明 int * foo 你只创建了一个指针。foo 实际上还没有指向任何东西——它是未初始化的。您甚至可能从这样的代码中得到分段错误,因为指针可能指向程序内存之外。如果你这样做:
int * foo = (int *)malloc(sizeof(int));
您将初始化指针,malloc 从传递给它的大小的堆中分配一些内存。你也可以这样做:
int bar = 0;
int * foo = &bar;
这将使 foo 成为指向 bar 的指针(& 返回变量的地址)。
你应该做这样的事情
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;
}