0

我知道为什么会这样:

#include <stdio.h>

void cool_number(int **number) {
  int value = 42;
  int *p = &value;
  *number = p;
}

int main () {
  int *number;
  cool_number(&number);
  printf("number is %d\n", *number);
  return 0;
}

我不明白为什么这不(在我的机器上打印3700或类似的东西)。

#include <stdio.h>

void cool_number(int **number) {
  int value = 42;
  int *p = &value;
  int **x = &p;
  number = x;
}

int main () {
  int *number;
  cool_number(&number);
  printf("number is %d\n", *number);
  return 0;
}

为什么两者不等价?

4

4 回答 4

3

两者都是邪恶的,因为它们捕获了堆栈变量的地址。

第二个没有达到您的预期,因为您直接分配给参数编号,这只是暂时的,第一个更改了参数编号指针指向的内容,这与 main 中的 number 指向相同。

于 2012-05-23T04:54:29.117 回答
2

我认为它们不等效,因为number在堆栈上按值传递,这是函数参数的标准。number您直接对inside 进行的任何更改都会cool_number()修改堆栈上的本地副本,并且不会反映在 in 的值numbermain()

在第一个示例中,您通过取消引用解决了这个问题number,它告诉计算机修改内存中的某个特定位置,而您也恰好有一个指向返回的指针main()。在第二个示例中您没有这个,所以所发生的只是您使本地number指针指向其他地方,而没有实际更新在main(). 因此,一旦您回到main().

而且由于valuecool_number()函数的本地,因此不能保证在返回后访问它的引用,cool_number()并且当然不应该在琐碎/玩具示例之外的任何代码中使用。但是在这个特定的例子中,它与为什么你在两段代码之间看到不同的结果并没有真正的关系。

于 2012-05-23T04:48:08.413 回答
1

据我了解,在这两种情况下,您的代码都是错误的。

  1. 在第一种情况下,您将地址返回给分配在堆栈上的变量,该变量将在函数返回后立即释放。

  2. 在第二种情况下,存在第一种情况的错误,加上您是按值传递数字,因此对数字的更新不会反映在调用者函数中。

在“C”中,参数总是按值传递。因此,您不能按原样更新传递的参数。例如:

int func(int a)
{
  a = 5; // In this case the value 5 will not be reflected in the caller as what is updated is the local copy of a on the stack
}

int func(int *a)
{

  *a = 5; // This update will show in caller as you are directly updating the memory pointed to by a
   a = malloc(4); //This update will not show in caller as again you are updating the local copy of stack       
}
于 2012-05-23T04:54:32.313 回答
0
#include <stdio.h>

void cool_number(int **number) {
  int value = 42; /* this "value" hold 42 value, 
                     and it lifetime is only in this function */
  int *p = &value; /* here we get the address of "value" in memory */
  *number = p;
}

int main () {
  int *number;
  cool_number(&number);  /* after this function the "value" in memory had been recyled
                            and may be used by other program */
  printf("number is %d\n", *number); /* so when we print value here it will be 
                                 a unpredictable value, somehow may be crash */
  return 0;
}

两者原理相同

于 2012-05-23T08:28:47.247 回答