0

ダブルポインター操作。回避策を提案します。

#include <iostream>
#include <stdio.h>
using namespace std;
/* Pointer Passed as argument */
void func(void **p1)
{
     printf("Func %d\n",*p1);
}
/* main Function */
int main()
{ 
 void **p1 = NULL;
 int *p = (int *)malloc(sizeof(int));
 p[0] = 20;
 func((void**)&p);//pass by address
 //How can we assign double pointer i.e (*p1 = &p)
 printf("Main %d",*p);   // print value
 cin.get();
 return 0;   
}
//function end main.cpp
/*
Func " Garbage value "
Main 20
*/

ダブルポインターを使用してデータを取得しようとしています。誰かがこれを調べて、バグがどこにあるか教えてもらえますか。

出力は 20 ~ 20 である必要があります Func 20 Main 20

4

2 に答える 2

2

で行う必要があるのは次のfunc(void **p1)とおりです。

printf("Func %d\n",*((int *)*p1));

値を取得するには、もう一度逆参照する必要がありintます。これは、ポインターからポインターであるためです。

また、(C にのみ適用可能)の戻り値をキャストしないでください。mallocC++ では、キャストが必要です (new演算子を使用することをお勧めします)。

メインでは、これを直接行うことができます:

  printf("Main %d",*((int *)*((  (void**)&p))));  
于 2013-10-29T05:04:02.377 に答える
1

関数内の printf は次のようになります。

printf("Func %d\n", *((int*)*p1));

関数でp1は、整数ポインタのアドレスを持っていますint * p。これは、一度逆参照すること*p1は、元のポインターと同等であることを意味しますp。したがって、それを an にキャストし、int *再度逆参照して値を取得します。

于 2013-10-29T05:02:50.430 に答える