You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 22:45:40