初始化后,结构数组中的值作为垃圾打印出来

问题描述

在过去的一天中,我一直很困惑这个问题。下面,我从主函数调用一个函数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;
}

解决方法

问题在于roomNamessetuprooms局部变量,因此一旦函数结束,它将耗尽其生命周期。这意味着在那一点上应该认为该内存的内容不确定。

这就是为什么您的第一个打印循环(即在setuprooms内)可以正常工作的原因。但是,一旦函数返回,您的程序现在就可以对内存进行任何操作。

要解决此问题,您有几种选择:

  1. roomNames设置为全局变量。
  2. 声明roomNames为静态变量(即static char roomNames[9][20] = ...)。这样可以防止程序在函数结束时释放该内存。
  3. 使用string.h中的strdup复制字符串。