如何解决初始化后,结构数组中的值作为垃圾打印出来
在过去的一天中,我一直很困惑这个问题。下面,我从主函数中调用一个函数setuprooms()
,该函数填充了传入的3×3结构数组。当我在setuprooms
函数中打印该数组的内容时,输出就很清楚。
但是,当我在main函数中执行此操作时,会得到一堆垃圾值。这是内存分配问题还是其他问题?板阵列是否需要动态分配?有点难过。
我正在使用的结构:
struct Room
{
char* name;
struct Room *north;
struct Room *south;
struct Room *east;
struct Room *west;
};
我正在使用的struct构造函数:
struct Room * rmconstruct(char* name,struct Room *north,struct Room *south,struct Room *east,struct Room *west)
{
struct Room *newRoom;
newRoom = (struct Room*) malloc(sizeof(struct Room));
newRoom->name = name;
newRoom->north = north;
newRoom->south = south;
newRoom->east = east;
newRoom->west = west;
return newRoom;
}
setuprooms()
函数循环9个单词,为每个单词创建一个Room
结构,并将这些结构分配给电路板阵列:
void setuprooms(struct Room * board[3][3])
{
char roomNames[9][20] = {
"kitchen","ballroom","conservatory","billiard room","library","study","hall","lounge","dining room"
};
int counter = 0;
struct Room * input;
for (int x = 0; x < 3; x++) {
for (int y = 0; y < 3; y++) {
char* nname = roomNames[counter++];
input = rmconstruct(nname,NULL,NULL);
board[x][y] = input;
}
}
// this prints out the contents of my array just fine
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%s\n",board[i][j]->name);
}
}
这是我的main
函数:
int main()
{
struct Room * board[3][3];
setuprooms(board);
// this prints out garbage values for some reason?
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%s\n",board[i][j]->name);
}
}
return 0;
}
解决方法
问题在于roomNames
是setuprooms
局部变量,因此一旦函数结束,它将耗尽其生命周期。这意味着在那一点上应该认为该内存的内容不确定。
这就是为什么您的第一个打印循环(即在setuprooms
内)可以正常工作的原因。但是,一旦函数返回,您的程序现在就可以对内存进行任何操作。
要解决此问题,您有几种选择:
- 将
roomNames
设置为全局变量。 - 声明
roomNames
为静态变量(即static char roomNames[9][20] = ...
)。这样可以防止程序在函数结束时释放该内存。 - 使用string.h中的
strdup
复制字符串。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。