sprintf循环仅输出最终值——字符指针数组存储异常求助
问题根源
你的代码核心问题是所有指针都指向了同一块栈内存:
char temp[10];是循环内部的局部变量,它的内存地址在每次循环迭代中是固定不变的(栈帧复用)。- 每次循环你把
printVal指向temp,再把这个指针存入printArray,导致数组里的12个指针全指向同一块内存。 - 循环结束后,这块内存里保留的是最后一次
sprintf写入的值(也就是11),所以遍历输出时全是同一个结果。
你说用strcpy没解决,大概率是没给目标指针分配独立内存——直接用未初始化的char *printVal去strcpy,本质还是没脱离“共享内存”的问题,甚至会触发非法内存访问。
修复方案
给每个字符串分配独立的堆内存,确保每个指针指向不同的存储空间:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char* printArray[12]; for (int i = 1; i <= 12; i++) { char temp[10]; sprintf(temp, "%d", i-1); // 分配足够内存存储字符串(+1是给结束符'\0'留位置) printArray[i-1] = malloc(strlen(temp) + 1); if (printArray[i-1] == NULL) { // 内存分配失败的处理逻辑 perror("malloc failed"); return 1; } strcpy(printArray[i-1], temp); printf("%s\n", printArray[i-1]); } // 遍历输出验证 for (int i = 0; i < 12; i++) { printf("%s\n", printArray[i]); // 用完记得释放内存,避免泄漏 free(printArray[i]); } return 0; }
或者更简洁的方式用strdup(它会自动分配内存并复制字符串):
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char* printArray[12]; for (int i = 1; i <= 12; i++) { char temp[10]; sprintf(temp, "%d", i-1); printArray[i-1] = strdup(temp); if (printArray[i-1] == NULL) { perror("strdup failed"); return 1; } printf("%s\n", printArray[i-1]); } for (int i = 0; i < 12; i++) { printf("%s\n", printArray[i]); free(printArray[i]); } return 0; }
补充说明
- 栈上的局部变量(比如
temp)在循环结束后会被释放,直接保存指向它的指针会导致悬空指针,后续访问属于未定义行为。 - 用堆内存存储每个字符串后,一定要记得用
free释放,避免内存泄漏。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

