我想使用本地指针指向全局字符串。指针是本地指针,字符串是全局的。当我运行此代码时,将本地指针传递给函数“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 );
}
答案 0 :(得分:5)
您正在按值将指针传递给myfun
。因此,您在p
中分配给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];
}
答案 1 :(得分: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
的值,并期望此更改反映在你通过的论点。那个,ptr1
和ptr2
是指针并不会改变你仍在传递值的事实。
另外,IANAL(也就是说,如果我错了,我希望语言律师纠正我),但我认为你可能会把指向void变量的指针作为printf的参数来解决问题。