如何在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
相关产品推荐
相关产品推荐

