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

スタック変数のアドレスをキャプチャするため、どちらも悪です。

2つ目は、一時的なパラメータ番号に直接割り当てているため、期待どおりに機能しません。1つ目は、パラメータ番号が指すものを変更します。これは、メインポイントの番号と同じです。

于 2012-05-23T04:54:29.117 に答える
2

number関数パラメーターの標準であるように、スタック上で値によって渡されるため、これらは同等ではないと思います。number内部に直接加えた変更cool_number()は、スタック上のローカルコピーを変更するものであり、inの値には反映されませnumbermain()

最初の例では、を逆参照することでこれを回避しますnumber。これは、メモリ内の特定の場所を変更するようにコンピュータに指示します。これにより、に戻るためのポインタもありますmain()。2番目の例ではこれがないため、numberで参照されているメモリ位置を実際に更新せずに、ローカルポインタが別の場所を指すようにするだけmain()です。したがって、に戻ると、何もしませんmain()

また、valueは関数に対してローカルであるため、戻り値cool_number()の後にアクセスされる関数への参照の設定は、機能することcool_number()が保証されておらず、些細な/おもちゃの例以外のコードで使用しないでください。ただし、この特定の例では、2つのコード間で異なる結果が表示される理由とは実際には関係ありません。

于 2012-05-23T04:48:08.413 に答える
1

私が理解しているように、どちらの場合も、あなたのコードは間違っています。

  1. 最初のケースでは、スタックに割り当てられた変数にアドレスを返します。この変数は、関数が戻るとすぐに割り当てが解除されます。

  2. 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 に答える