1

グローバル文字列を指すローカル ポインターを使用したいと考えています。ポインターはローカル ポインターであり、文字列はグローバルです。関数 "myfun" にローカル ポインターを渡してこのコードを実行すると、ポインターは変更されません。つまり、そのポインター アドレスは変更されません。表示される値は「NULL」です。

これがgccで機能しない理由を誰か教えてもらえますか?

#include <stdio.h>

char *str[] = { "String #1", "Another string" };

void myfun( void * p, int i ) 
{ 
    p = ( void * ) &str[ i ][ 0 ]; 
}

int main( void ) 
{ 
    void * ptr1, * ptr2;

    myfun( ptr1, 0 ); 
    myfun( ptr2, 1 ); 
    printf( "%s\n%s\n", ptr1, ptr2 ); 
}
4

2 に答える 2

5

へのポインタを値で渡していますmyfunpしたがって、 in に割り当てた値myfunは呼び出し元に返されません。ポインターにポインターを渡す必要があります。

void myfun( void ** p, int i ) 
{ 
    *p = ( void * ) &str[ i ][ 0 ]; 
}

そして、次のように呼び出します。

myfun( &ptr1, 0 ); 

myfun実際、次のように書くことができます。

void myfun( void ** p, int i ) 
{ 
    *p = str[i]; 
}

実際にはvoid*、関数の戻り値としてを返すのが最も簡単です。

void *myfun( int i ) 
{ 
    return str[i]; 
}
于 2012-05-24T16:57:33.370 に答える
0

基本的に、あなたの質問は-と何ら変わりはありません

void func(int i)
{
  i = 2;
}

int main()
{
  int i = 0;
  printf("i = %d\n", i);
  func(i);
  printf("i = %d\n", i); /* Wonder why it doesn't output i = 2? */
}

コードでは、引数を値で渡しptr1(およびptr2)、受け取ったパラメーターの値を変更し、pこの変更が渡した引数に反映されることを期待します。つまり、それptr1ptr2はポインタであり、値を渡しているという事実は変わりません。

また、IANAL(つまり、私が間違っている場合は言語弁護士が私を訂正してくれることを願っています)ですが、printfの引数としてvoid変数へのポインターを送信することで、問題が発生する可能性があると思います。

于 2012-05-24T18:48:35.607 に答える