C语言结构体数组中字符串字段值异常问题求助
哥们,你遇到的这个问题其实是C语言新手很容易踩的一个坑——所有结构体实例的name和address指针都指向了同一个局部数组input,咱们一步步拆解来看:
问题根源
你定义的input是栈上的局部数组(char input[30];),每次循环里的sprintf都是往这块固定的内存地址里写内容。然后你把input的地址赋值给structArray[i].name和structArray[i].address,相当于所有结构体的这两个指针都指向了同一块内存空间。
循环到最后一次时,input里的内容被改成了"addr_2",所以当你后续打印所有结构体的name和address时,它们都会读取这块内存的最终值,自然全是addr_2了。
修复方案
要解决这个问题,你需要给每个结构体的name和address分配独立的内存空间,这样每次写入的内容就不会互相覆盖。常用的两种方法:
方法1:使用strdup(推荐,简洁)
strdup会自动分配足够的内存来复制字符串,然后返回指向新内存的指针。注意:Windows平台下标准库没有strdup,可以用_strdup替代。
修改后的循环赋值代码:
for (int i = 0; i < nStructs; i++) { structArray[i].id = i; sprintf(input, "name_%d", i); // 分配内存并复制字符串 structArray[i].name = strdup(input); sprintf(input, "addr_%d", i); structArray[i].address = strdup(input); }
方法2:手动malloc + strcpy
如果你想更明确地控制内存分配,可以手动调用malloc分配内存,再用strcpy复制内容:
for (int i = 0; i < nStructs; i++) { structArray[i].id = i; sprintf(input, "name_%d", i); // 分配足够存下字符串+结束符的内存 structArray[i].name = malloc(strlen(input) + 1); if (structArray[i].name == NULL) { // 内存分配失败的处理逻辑 perror("malloc failed"); exit(EXIT_FAILURE); } strcpy(structArray[i].name, input); sprintf(input, "addr_%d", i); structArray[i].address = malloc(strlen(input) + 1); if (structArray[i].address == NULL) { perror("malloc failed"); exit(EXIT_FAILURE); } strcpy(structArray[i].address, input); }
重要补充:内存泄漏修复
你现在补充了free(structArray);,但还要记得每个结构体里的name和address指针指向的内存也需要单独释放,否则会造成内存泄漏。在free(structArray);之前添加循环:
// 先释放每个结构体内部的动态内存 for (int i = 0; i < nStructs; i++) { free(structArray[i].name); free(structArray[i].address); } free(structArray);
调试小技巧(针对Visual Studio)
在VS里调试时,你可以在监视窗口输入structArray,3(3是你的数组长度),这样就能一次性看到整个数组的所有元素。展开每个元素后,你会发现所有name和address的地址都是完全相同的,这就能直观地看出它们指向了同一块内存,帮你快速定位问题。
内容的提问来源于stack exchange,提问作者user5805283

