C语言 指向全局函数的本地指针



我想使用本地指针指向全局字符串。指针是本地指针,字符串是全局指针。当我运行这段代码将本地指针传递给函数"myfun"时,指针不会改变,即它的指向地址不会改变。打印的值为"空"。

有人可以告诉我为什么这不适用于 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( "%sn%sn", ptr1, ptr2 ); 
}

您正在按值传递指向myfun的指针。因此,您分配给 myfun p 的值不会返回给调用方。您需要传递指向指针的指针:

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]; 
}

从根本上说,你的问题与 -

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

在代码中,按值传递ptr1(和ptr2)参数,更改收到的参数p的值,并期望此更改反映在传递的参数上。 ptr1ptr2是指针并不能改变您仍在按值传递的事实。

另外,IANAL(即,如果我错了,我希望语言律师纠正我),但我认为通过将指向 void 变量的指针作为 printf 的参数发送可能会遇到麻烦。

相关内容

  • 没有找到相关文章

最新更新