C语言逗号分隔字符串转数组时字符类型处理异常问题求助
问题根因
- 变量类型定义错误:你需要存储多个字符串(即多个
char*指针),因此s1应该定义为char**类型而非char*,ListChar函数的第二个参数list也应该是char**类型,否则list[n] = strdup(t)会把64位/32位指针地址截断为单个char值,自然出现乱码。 - 此前整数转换逻辑正常,是因为你当时
list对应的是int*类型,赋值list[n] = atoi(t)是直接把整数值存入对应int空间,类型匹配;但字符串需要存储char*指针,原char* list的类型完全不匹配,才会出现乱码。 - 野指针访问:
void* value没有分配内存就直接执行memcpy,属于未定义行为,会触发崩溃或乱码。 - 内存分配逻辑错误:原
calloc分配的是no * 81字节的字符空间,而非存储no个字符串指针的空间,完全不符合存储需求。 - 内存泄漏隐患:原代码中
strdup申请的内存没有对应释放逻辑,会造成内存泄漏。
修正方案
调整ListChar函数定义
// 第二个参数改为char**类型,对应存储字符串指针的数组 int ListChar(char *buf, char** list, int maxloop, char* delim) { int n = 0; char *s,*t; s = strdup(buf); t = strtok(s, delim); while (t && (n < maxloop)) { if (list != NULL) { // 先释放原有预分配的内存,避免泄漏 if (list[n] != NULL) free(list[n]); list[n] = strdup(t); } n++; t = strtok(NULL, delim); } free(s); return n; }
修正主函数逻辑
#include <stdio.h> #include <stdlib.h> #include <string.h> // mchar定义为81个A #define mchar "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" int main() { char **s1; int k, no = 5; char* variable = "R1,R2,R3,R4,R5"; // 给value分配对应大小的指针数组空间 char** value = calloc(no, sizeof(char*)); // 分配no个char*指针的空间 s1 = calloc(no, sizeof(char*)); // 预分配每个元素的初始值 for (k = 0; k < no; k++) s1[k] = strdup(mchar); // 传入s1本身(char**类型) ListChar(variable, s1, no, ","); // 拷贝指针数组内容到value memcpy(value, s1, no * sizeof(char*)); // 只释放s1的指针数组空间,不要释放s1[k],因为已经被value引用 free(s1); int i; for (i = 0; i < no; i++) { printf("%s ", value[i]); // 用完释放strdup申请的内存 free(value[i]); } // 释放value本身的空间 free(value); printf("\n"); return 0; }
运行验证
修正后代码可正常输出分隔后的字符串:R1 R2 R3 R4 R5
内容的提问来源于stack exchange,提问作者Hamza Saiger
相关产品推荐
相关产品推荐

