每当我尝试打印字符串时,我的代码都会出现段错误

问题描述 投票:0回答:1

我正在开发一款在 Linux 终端上运行的游戏。我一直在开发一个系统来加载地图文件,将其转换为自定义结构字符串,然后打印结构所包含的字母和颜色。问题是,每当我使用

printf("%s", myString);
时,代码都会出现段错误。问题代码如下:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define BUFFLEN 3
#define DICLEN 3


/*a structure that holds basic tile info*/
typedef struct{
    char letter;
    char *color;
    char *name;
} tile;

/*a struture that holds general map info*/
typedef struct{
    const int mapHight;
    const int mapWidth;
    const int mapSize;
    const char *mapname;
} mapinfo;

/*dictionary that holds tiles*/
tile dic[DICLEN] = {
        {'T', "\033[38;5;2m", "Tree"},
        {' ', "\033[0m", "Path1"},
        {'\n', "\033[0m", "newLine"}
};

/*return a tile when given a name*/
tile dictionary(char *tileName){
    int i = 0;
    for (; i<DICLEN; i++){
        if ( (strcmp(tileName, dic[i].name) ) == 0){
                        goto END;
                }
    }
    goto ERROR;
    
    END:
    return dic[i];

    ERROR:
    fprintf(stderr, "that string is unreconnized");
    exit(-1);
}

/*gets map size to make into an array*/
mapinfo getMapSize(char *mapName){
    char mapFilePath[24] = "maps/";

    strcat(mapFilePath, mapName);
    char buffer[BUFFLEN];

    FILE *mapfile = fopen(mapFilePath, "r");
    
    for(int i; i < BUFFLEN; i++){
        buffer[i] = getc(mapfile); 
    }
    int mapWidth = atoi(buffer)+1;
    getc(mapfile);

    for(int i = 0; i < BUFFLEN; i++){
        buffer[i] = getc(mapfile);
    }
    int mapHight = atoi(buffer);

    int mapSize = mapHight * mapWidth;
    fclose(mapfile);
    
    mapinfo finalMap = {mapHight, mapWidth, mapSize, mapFilePath};
    return finalMap;
}

/*initalize map; put tiles into the map array*/
void mapInit(tile *mapArray, char *mapName){
    FILE *mapFile = fopen(mapName, "r");
    int i = 1, o = 0;
    char c;

    //this is to skip over the map size information
    for(;(c = getc(mapFile))!= '\n';){}

    for(;(c = getc(mapFile)) != EOF; i++){
        for(o = 0; o < DICLEN; o++){
            if(c == dic[o].letter){
                mapArray[i] = dictionary(dic[o].name);
            }
        }
        // un-comment this line for debug if needed
        //printf("%d\t%c%c\n",i, c, mapArray[i].letter);
    }

    fclose(mapFile);
}

int main(){
    mapinfo map1Info = getMapSize("map1.map");
    tile map1[map1Info.mapSize];
    mapInit(map1, map1Info.mapname);
    
    printf("%s%c\n", map1[0].color, map1[0].letter);

    return 0;
}

我正在尝试阅读的信息(

maps/map1.map
)是这样的:

011 010
TT TT T TTT
T T TTT TTT
T TT TTT TT
TTT TTTT TT
T T TTT  TT
TT TT TT TT
TT TT TTT T
T TTT TT TT
T TT T T  T
TTT TT    T

它应该打印一个绿色的T

每当我将

printf("%s%c\n", map1[0].color, map1[0].letter);
更改为
printf("%c\n", map1[0].letter);
时,代码都会打印,但显然,不再有颜色,我宁愿有颜色。 我尝试将图块结构中的指针转换为数组,但编译器无论如何都会给我警告和段错误。

附加说明:是的,我知道

char c
中的
mapInit
应该是一个 int,而且我有几个需要解决的嵌套 for 循环。对于大部分代码,虽然只放入了足够的内容以使其工作,但不能很好地工作(尽管提示会很好,因为我仍然不知道如何解决其中一些问题)。

编辑:通过调试器(gdb)运行我的代码后,我可以找到:

(gdb) run
Starting program: /home/iggoth/Desktop/Programs/AKnightsTale/Game 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Program received signal SIGSEGV, Segmentation fault.
__strlen_sse2 () at ../sysdeps/x86_64/multiarch/strlen-vec.S:126
126 ../sysdeps/x86_64/multiarch/strlen-vec.S: No such file or directory.
(gdb) list
121 in ../sysdeps/x86_64/multiarch/strlen-vec.S
(gdb) 

我没有查到其他信息

编辑2:运行 backtrace 命令后:

(gdb) run
Program received signal SIGSEGV, Segmentation fault.
__strlen_sse2 () at ../sysdeps/x86_64/multiarch/strlen-vec.S:126
126 ../sysdeps/x86_64/multiarch/strlen-vec.S: No such file or directory.
(gdb) backtrace
#0  __strlen_sse2 () at ../sysdeps/x86_64/multiarch/strlen-vec.S:126
#1  0x00007ffff7df1d31 in __vfprintf_internal (s=0x7ffff7f95780 <_IO_2_1_stdout_>, format=0x555555556129 "%s%c\n", ap=ap@entry=0x7fffffffce70, 
    mode_flags=mode_flags@entry=0) at ./stdio-common/vfprintf-internal.c:1517
#2  0x00007ffff7ddb79f in __printf (format=<optimized out>) at ./stdio-common/printf.c:33
#3  0x0000555555555906 in main () at Main.c:12
(gdb) 
c pointers struct segmentation-fault printf
1个回答
0
投票

我发现了一个明显的问题。

代码中:

mapinfo getMapSize(char *mapName){
    char mapFilePath[24] = "maps/";
    :
    mapinfo finalMap = {mapHight, mapWidth, mapSize, mapFilePath};
    return finalMap;
}

mapFilePath
是一个局部变量,您将指向它的指针放入要返回的
finalMap
对象中,因此它将悬空(当您返回时,局部变量将消失,使指针无效)。

并不是说没有其他问题——代码看起来像是解决悬空指针问题的方法。

© www.soinside.com 2019 - 2024. All rights reserved.