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

您正在将指针按值传递给myfun. 因此,您分配给pin的值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(and ptr2) 参数,更改p您收到的参数的值,并期望此更改反映在您传递的参数上。that, that ptr1and ptr2are 指针不会改变您仍然按值传递的事实。

另外,IANAL(即,如果我错了,我希望语言律师纠正我),但我认为您可能会通过将指向 void 变量的指针作为参数发送给 printf 来解决问题。

于 2012-05-24T18:48:35.607 回答