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

全局结构体数组初始化后main函数无法正常打印值的求助

问题分析与解决方案

你的问题核心出在局部变量的生命周期上,咱们一步步拆解清楚:

为什么会打印乱码?

在function()里,val1和val2是栈上的局部字符数组——当函数执行完毕返回main时,这个函数对应的栈帧会被销毁,局部变量占用的内存会被系统回收或后续操作覆盖。而你的结构体S里的value是指针,它保存的是val1/val2的内存地址,现在这个地址已经不属于有效数据了,所以main里访问它就会出现乱码(本质是C语言里的「未定义行为」)。

你用int类型数组有效,是因为int是直接把值存在结构体里,而不是存指针,不存在指向无效内存的问题。

可行的解决方案

方案1:使用字符串常量(最简单)

字符串常量存储在程序的只读数据段里,生命周期和整个程序一致,不会随函数结束而销毁。修改function()里的赋值逻辑即可:

void function( ){
    // 直接用字符串常量,而非局部数组
    S v1 = {"val1"};
    S v2 = {"val2"};
    list[0] = v1;
    list[1] = v2;
    printf("%s\n", list[1].value); //prints val2
}

方案2:动态分配内存(适合需要修改字符串的场景)

如果之后需要修改value指向的字符串,可以用malloc在堆上分配内存,再把字符串拷贝进去:

#include <string.h> // 需要引入string.h来使用strcpy

void function( ){
    char val1[] = "val1";
    char val2[] = "val2";
    S v1, v2;
    // 分配足够的内存(要包含字符串末尾的'\0')
    v1.value = malloc(strlen(val1) + 1);
    v2.value = malloc(strlen(val2) + 1);
    // 把字符串拷贝到堆内存中
    strcpy(v1.value, val1);
    strcpy(v2.value, val2);
    list[0] = v1;
    list[1] = v2;
    printf("%s\n", list[1].value); //prints val2
}

⚠️ 注意:用malloc分配的内存需要在合适的地方用free释放,避免内存泄漏。比如在main函数末尾可以加上:

free(list[0].value);
free(list[1].value);

方案3:把局部数组改成静态的

静态局部变量存储在全局数据段,生命周期也是整个程序,函数结束后不会被销毁:

void function( ){
    static char val1[] = "val1";
    static char val2[] = "val2";
    S v1 = {val1};
    S v2 = {val2};
    list[0] = v1;
    list[1] = v2;
    printf("%s\n", list[1].value); //prints val2
}

不过静态变量是全局唯一的,如果多次调用function()会覆盖之前的值,你可以根据自己的实际需求选择。

验证修改后的代码

比如用方案1的完整代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct s{
    char *value;
} S;

S list[2];

void function( ){
    S v1 = {"val1"};
    S v2 = {"val2"};
    list[0] = v1;
    list[1] = v2;
    printf("%s\n", list[1].value); //prints val2
}

int main(int argc, char** argv) {
    function();
    printf("%s", list[1].value); //prints val2
    return 0;
}

运行后main里就能正常打印val2了。

内容的提问来源于stack exchange,提问作者youngwarlock

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:58:52