C语言strtok返回乱码及Uninitialized variable accessed报错求解
问题根源
1. 返回局部栈内存指针导致乱码
函数内定义的char pathcpy[strlen(path) + 1];是栈上分配的局部数组,它的生命周期仅在headPathName函数执行期间有效。当函数执行完毕返回后,这块栈空间会被操作系统回收,后续其他函数调用(比如main里的printf)会覆盖这块内存的原有内容。你返回的filename指针指向的就是已经被回收的无效内存,访问它就会出现乱码、段错误等未定义行为,这是你得到0���类乱码的核心原因。
2. 未初始化变量报错的原因
部分编译器的静态检测规则会识别到你返回的指针指向已销毁的栈空间,添加printf语句后栈帧布局变化,进一步触发了编译器对无效内存访问的检测,因此抛出相关报错。
修复方案
你可以选择以下两种常用方案解决该问题:
- 方案1:在堆上分配内存存储结果,使用完后手动释放
#include <stdio.h> #include <string.h> #include <stdlib.h> char * headPathName(char *path) { char *pathcpy = malloc(strlen(path) + 1); if (pathcpy == NULL) return NULL; strcpy(pathcpy, path); char *filename = strtok(pathcpy, "/"); if (filename != NULL) { // 单独拷贝结果,释放临时申请的pathcpy char *res = malloc(strlen(filename) + 1); strcpy(res, filename); free(pathcpy); return res; } free(pathcpy); return NULL; } int main(void) { char *str = "hi/hello"; char *name = headPathName(str); if (name != NULL) { printf("%s\n", name); free(name); // 内存使用完毕后手动释放 } return 0; }
- 方案2:调用方提前传入缓冲区存储结果,避免动态内存分配
#include <stdio.h> #include <string.h> void headPathName(char *path, char *buf, size_t buf_size) { char pathcpy[strlen(path) + 1]; strcpy(pathcpy, path); char *filename = strtok(pathcpy, "/"); if (filename != NULL && buf_size > strlen(filename)) { strcpy(buf, filename); } else { buf[0] = '\0'; } } int main(void) { char *str = "hi/hello"; char buf[256]; headPathName(str, buf, sizeof(buf)); printf("%s\n", buf); return 0; }
内容的提问来源于stack exchange,提问作者Jin
相关产品推荐
相关产品推荐

