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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:55:29