C程序中数组元素为何全部等于最后添加的值?
问题原因
你的代码核心问题是:arr数组存储的全是指向同一个字符数组s的指针。s是函数开头定义的局部数组,每次循环都会把新字符串拷贝到s里,覆盖掉之前的内容。当最后遍历arr时,所有指针都指向同一个s,而s最后一次被赋值的内容是25F,所以输出结果全为这个值。
解决方案
有两种常见的修复方式:
方法一:动态分配独立内存
每次循环为字符串分配单独的内存空间,让每个指针指向不同的内存区域,避免后续循环覆盖内容。修改后的代码如下:
void func() { char c[10]; char *arr[150]; int idx = 0; for (int i = 1; i <= 25; ++i) { for (char j = 'A'; j <= 'F'; ++j) { sprintf(c, "%d%c", i, j); // 用strdup直接分配内存并拷贝字符串 arr[idx++] = strdup(c); // 也可以手动malloc+strcpy: // arr[idx] = malloc(strlen(c) + 1); // strcpy(arr[idx++], c); printf("%s ", c); } } for (int i = 0; i < 150; ++i) { printf("%s\n", arr[i]); // 用完后释放内存,防止泄漏 free(arr[i]); } }
注意:通过strdup或malloc分配的内存,使用完毕必须用free释放,避免内存泄漏。
方法二:使用二维字符数组
直接定义二维数组,每个元素都是独立的字符串存储空间,无需手动管理内存。修改后的代码:
void func() { char arr[150][10]; // 150个字符串,每个最多存储10个字符 int idx = 0; for (int i = 1; i <= 25; ++i) { for (char j = 'A'; j <= 'F'; ++j) { // 直接把字符串写入二维数组的对应位置 sprintf(arr[idx++], "%d%c", i, j); printf("%s ", arr[idx-1]); } } for (int i = 0; i < 150; ++i) { printf("%s\n", arr[i]); } }
这种方式更简洁,但需要提前确定字符串的最大长度和数组总个数。
内容的提问来源于stack exchange,提问作者Gábor Kiss
相关产品推荐
相关产品推荐

