C语言通过char数组指针参数返回函数结果未生效问题排查
问题根因
- C语言函数参数默认采用值传递规则,
get_address中的形参char *address是主函数内address数组首地址的临时副本,二者是独立的两个内存变量 - 函数内执行
address = "123456"仅修改了临时指针副本的指向,让它指向了字符串常量"123456"的首地址,完全没有改动主函数中address数组的实际内容 - 主函数内的
address是栈上的局部数组,未做初始化也没有被写入有效内容,所以最终打印结果为空,不符合预期
正确实现方案
方案1:字符串拷贝写入数组
直接将字符串内容拷贝到传入的数组空间中,无需修改指针指向:
#include <stdio.h> #include <string.h> static void get_address(char *address) { strcpy(address, "123456"); } int main(int argc, const char * argv[]) { char address[34]; get_address(address); printf("Result: %s\n",address); return 0; }
注意:需要保证传入的数组长度足够容纳要拷贝的字符串(包括末尾的
\0结束符),避免内存越界。
方案2:传入二级指针修改外部指针指向
如果希望直接让外部指针指向字符串常量地址,可以传入指针的地址(二级指针)实现:
#include <stdio.h> static void get_address(char **address) { *address = "123456"; } int main(int argc, const char * argv[]) { char *address; get_address(&address); printf("Result: %s\n",address); return 0; }
注意:该方案返回的是字符串常量的地址,禁止修改该地址指向的内容,否则会触发未定义行为。
内容的提问来源于stack exchange,提问作者eztam
相关产品推荐
相关产品推荐

