为何无法通过函数访问char指针?如何实现指针传递字符串?
问题原因
你这段代码的问题出在局部变量的生命周期上:process函数里的buffer是存储在栈上的局部数组,当process执行完毕返回后,它所在的栈帧会被操作系统回收,这块内存的内容会被覆盖或变为无效数据。你把buffer的首地址赋值给了main里的str,但process返回后,str指向的是已经被释放的无效内存(野指针),此时再打印它的内容就会出现乱码,甚至可能导致程序崩溃。
解决方法
针对你的需求,有几种可行的方案:
方法1:使用动态内存分配
在process里用malloc分配堆内存,堆内存不会随函数返回被销毁,不过记得在main里用完后释放内存,避免泄漏。
#include <stdio.h> #include <stdlib.h> #include <string.h> void process(char **nbE) { // 按需分配足够的内存,这里示例分配8字节 char *buffer = malloc(8); if (buffer == NULL) { perror("malloc failed"); *nbE = NULL; return; } strcpy(buffer, "test"); *nbE = buffer; printf("%s\n", *nbE); } int main(int argc, char **argv) { char *str; process(&str); if (str != NULL) { printf("%s\n", str); free(str); // 释放堆内存 } return 0; }
方法2:用static修饰局部数组
给buffer加上static关键字,它的生命周期会变成整个程序运行期间,不会随process返回被销毁。但注意static变量是全局唯一的,多次调用process会覆盖它的内容。
#include <stdio.h> #include <string.h> void process(char **nbE) { static char buffer[8] = "test"; *nbE = buffer; printf("%s\n", *nbE); } int main(int argc, char **argv) { char *str; process(&str); printf("%s\n", str); return 0; }
方法3:由main提前分配缓冲区并传入
内存由调用者(main)管理,process只负责写入内容,这种方式更安全,避免内存泄漏风险。
#include <stdio.h> #include <string.h> // 传入已分配好的缓冲区和缓冲区大小 void process(char *nbE, size_t buf_size) { strncpy(nbE, "test", buf_size - 1); nbE[buf_size - 1] = '\0'; // 确保字符串以结束符收尾 printf("%s\n", nbE); } int main(int argc, char **argv) { char str[8]; // 在main里分配缓冲区 process(str, sizeof(str)); printf("%s\n", str); return 0; }
内容的提问来源于stack exchange,提问作者ADL92
相关产品推荐
相关产品推荐

