c - 为什么这段代码的行为不可预测?

标签 c segmentation-fault malloc

我正在开发一款主机游戏,其中包含以下代码:

typedef struct player{
        char *name;
        /* ... */
        char location;
        char traveltime;
        /* ... */
}pl;

typedef struct planet{
        char *name;
        /* ... */
}planet;

pl *players;
planet plan[22];

pl *players 已分配

players=malloc(NPLAYERS*sizeof(pl));

其中 NPLAYERS 是玩家数量。 plan[] 是游戏中所有行星的数组。

players[i].location
如果players[i].traveltime==0,

是作为plan[]的下标的玩家的位置。如果players[i].traveltime>0,则玩家正在前往players[i].location。 因此,当玩家旅行时,我想显示一个 ncurses 窗口,说明“正在前往(行星)的途中”。

为此我使用:

char *tmp, msg[]="PLAYER 1", i;
for(i=0; i!=NPLAYERS; ++i){
            infobox(msg);
            if( players[i].traveltime>0){
                    tmp=malloc( sizeof("en route to ")+sizeof(plan[ players[i].location ].name)+4)
                    strcpy(tmp, "en route to ");
                    strcat(tmp, plan[ players[i].location ].name);
                    strcat(tmp, "..\0");
                    infobox(tmp);
                    free(tmp);
            }
            ++msg[7];
  }

其中 infobox(char msg[]) 将包含消息的 ncurses 窗口打印到 stdout,NPLAYERS 是玩家数量。这个想法是,这段代码循环遍历所有玩家,检查他们是否正在旅行,如果是,则打印一条消息,说明他们的目的地。 这十次中有九次有效,但有时它会在 free(tmp) 处出现段错误,在 malloc 处出现段错误或者打印

    ***** glibc detected *** ./st: malloc(): memory corruption [a hex number] ***

在 malloc 之后。 为什么会这样?我该如何解决?

了解我在一台两年前的笔记本电脑上使用 Arch Linux 可能会有所帮助。

最佳答案

sizeof(plan[players[i].location ].name)中,您正在获取指针的大小。 您可能想要最大行星名称的大小......

    tmp=malloc( sizeof("en route to ")+sizeof(plan[ players[i].location ].name)+4);

对比

    //tmp = malloc(13 + sizeof(char *) + 4);
    //tmp = malloc(17 + sizeof(char *));

    tmp = malloc(1700); /* arbitrary big enough value :) */

关于c - 为什么这段代码的行为不可预测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9656559/

相关文章:

c++ - 段错误[二维数组]

c++ - Mac High Sierra 上 C++ 中的段错误 11

c - <错误: Cannot access memory at address 0x0> 3d array malloc

c - 这些堆栈和堆内存地址有什么区别?

c - 停止单个线程

c++ - 使用 C++ 回调围绕 C++ 类编写 C 包装器

c++ - 在opencv中聚类图像片段

c++ - 条件跳转或移动取决于未初始化的值和段错误

涉及动态分配二维数组的 malloc 的 C 代码在编译后崩溃

c - 在 C 中将 Int 写入文件