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

如何在C语言for循环中创建独立字符数组(不使用malloc)

问题:循环中创建字符数组共享地址,打印仅显示最后一次赋值结果

我尝试在for循环的每次执行中创建新的字符数组,但该数组在每次循环中共享同一地址,打印时仅输出最后一次赋值的结果。请问如何在不使用malloc等堆分配函数的情况下避免该问题?

相关代码如下:

#include <stdio.h>

typedef struct {
    char* text;
} t_page;

typedef struct {
    t_page* pages;
    char* title;
} t_book;

t_page new_page(char* text) {
    t_page page = {text};
    return page;
}

t_book new_book(t_page pages[], char* title) {
    t_book book = {pages, title};
    return book;
}

int main() {
    t_page pages[10];
        
    for (int i = 0; i < 10; i++) {
        char text[2]; // 我想在这里创建一个全新的字符数组
        sprintf(text, "%d", i);
        
        pages[i] = new_page(text);
    }
   
    t_book book = new_book(pages, "my book");
    printf("%s\n", book.pages[0].text); // 打印出'9'而非预期的'0'
    
    return 0;
}

注:我刚接触C语言,未阅读手册或教程,仅出于兴趣摸索。我原本预期循环每次执行会创建新字符数组,但实际却共享地址和最后赋值结果,与预期不符。


解决方案

问题根源在于循环里定义的char text[2]是栈上的局部变量,每次循环迭代时,这个变量会被分配到栈上的同一个位置。循环结束后,所有t_page里的text指针都指向这个栈地址,而最后一次循环把该地址的内容改成了'9',所以打印所有元素都会显示'9'。

不用堆分配的话,有两种简单可行的解决思路:

1. 修改结构体,让每个page自带独立数组空间

把t_page里的指针改成直接存储字符数组,这样每个t_page实例都会拥有自己独立的存储空间,不会共享地址:

#include <stdio.h>

// 修改t_page结构体,直接包含字符数组
typedef struct {
    char text[2]; // 每个page自带独立的数组空间
} t_page;

typedef struct {
    t_page* pages;
    char* title;
} t_book;

t_page new_page(char* text) {
    t_page page;
    // 把text的内容复制到page的数组中
    page.text[0] = text[0];
    page.text[1] = text[1];
    return page;
}

t_book new_book(t_page pages[], char* title) {
    t_book book = {pages, title};
    return book;
}

int main() {
    t_page pages[10];
        
    for (int i = 0; i < 10; i++) {
        char text[2];
        sprintf(text, "%d", i);
        
        pages[i] = new_page(text);
    }
   
    t_book book = new_book(pages, "my book");
    printf("%s\n", book.pages[0].text); // 正确打印'0'
    printf("%s\n", book.pages[9].text); // 打印'9'
    
    return 0;
}

2. 提前在栈上分配好所有独立数组

在main函数里定义一个二维数组,每个子数组对应一个page的文本,确保每个子数组都是独立的栈空间:

#include <stdio.h>

typedef struct {
    char* text;
} t_page;

typedef struct {
    t_page* pages;
    char* title;
} t_book;

t_page new_page(char* text) {
    t_page page = {text};
    return page;
}

t_book new_book(t_page pages[], char* title) {
    t_book book = {pages, title};
    return book;
}

int main() {
    t_page pages[10];
    // 提前分配10个独立的char数组,每个占2字节
    char page_texts[10][2];
        
    for (int i = 0; i < 10; i++) {
        sprintf(page_texts[i], "%d", i);
        // 指向每个独立的数组地址
        pages[i] = new_page(page_texts[i]);
    }
   
    t_book book = new_book(pages, "my book");
    printf("%s\n", book.pages[0].text); // 正确打印'0'
    printf("%s\n", book.pages[9].text); // 打印'9'
    
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 19:50:12