0

说我有一个变量

int * foo;

我将此变量传递给

func(int *x)
{
  *x = bar;
}

但是,这不起作用。但是,如果我放置一个非指针(比如将其更改为int foo;)并直接放入地址,则此方法有效。

为什么我的第一个案例不起作用?

谢谢!

4

3 回答 3

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)在这种情况下,您也可以使用。

于 2013-10-28T23:02:25.720 回答
1

通过声明 int * foo 你只创建了一个指针。foo 实际上还没有指向任何东西——它是未初始化的。您甚至可能从这样的代码中得到分段错误,因为指针可能指向程序内存之外。如果你这样做:

int * foo = (int *)malloc(sizeof(int));

您将初始化指针,malloc 从传递给它的大小的堆中分配一些内存。你也可以这样做:

int bar = 0;
int * foo = &bar;

这将使 foo 成为指向 bar 的指针(& 返回变量的地址)。

于 2013-10-28T23:09:31.977 回答
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;
}
于 2013-10-28T23:08:57.630 回答