При доступе к моей графике в моей структуре она печатает пустую строку - PullRequest
0 голосов
/ 14 ноября 2018

Вот структура, которую я использую.

#define MAX_CAR_LEN 12    ///< length does not include the trailing NUL byte


/// Racer_S structure represents a racer's row, position and display graphic.

    typedef struct Racer_S {

        int row;       ///< vertical row or "racing lane" of a racer

        int distance;  ///< column of rear of car, marking its position in race

        char *graphic; ///< graphic is the drawable text of the racer figure

    } Racer;

Когда я вызываю эту функцию, внутри нее все работает нормально и все создает правильно. Я могу получить доступ к ряду и расстояние в порядке. Когда я пытаюсь распечатать графику, в моем терминале печатается пустая строка. Я полагаю, что это может быть потому, что «графика» в структуре - это char *, но я назначаю ему массив char фиксированного размера. Когда эта функция вызывается и передается под именем «Том», предполагается, что рисунок будет «~ O = Tom ---- o>». Я новичок в C, что я делаю не так?

Racer * make_racer( char *name, int row ){
    //Creating a newRacer instance
    Racer *newRacer = malloc(sizeof(*newRacer));
    newRacer->graphic = (char*)malloc(MAX_CAR_LEN);
    char car[MAX_CAR_LEN] = "~O=";     //"~O=-------o>"
    char *pCar;
    int length = strlen(name) + 2;
    //Add the name after the engine of the car
    for (int i = 0; i < length; ++i)
        car[i+3] = name[i];
    //Calculate the amount of dashes needed
    int printDashes = 7 - strlen(name);
    //add the extra dashes
    for (int j = 1; j <= printDashes; ++j)
        car[length + j] = '-';

    // creates the end of the car
    car[MAX_CAR_LEN-2] = 'o';
    car[MAX_CAR_LEN-1] = '>';
    pCar = strdup(car);

    newRacer->row = row;
    newRacer->distance = 0;
    newRacer->graphic = &car[0];
//    printf("%s\n", car);
    return newRacer;
}

Это код, который я запускаю на своей главной странице, чтобы проверить его

Racer *t = make_racer("Tom", 4);
printf("%s\n", t->graphic);

1 Ответ

0 голосов
/ 14 ноября 2018

Вы упомянули ниже утверждение в вашем вопросе.

Это код, который я запускаю на своей главной странице, чтобы проверить его

acer *t = make_racer("Tom", 4);
printf("%s\n", t->graphic);

В функции make_racer вы использовали локальный массив символовпеременная называется car и присваивает адрес newRacer-> graphic .Эта переменная (char car [MAX_CAR_LEN + 1];) памяти выходит из области видимости после возврата из функции.

Пожалуйста, обратитесь к этой теме , чтобы узнать больше о локальной области видимости в C.

Теперь, чтобы решить вашу проблему, в функции make_racer необходимо динамически распределять память для newRacer-> graphic .

Racer * make_racer( char *name, int row ){
:
    Racer *newRacer = malloc(sizeof(*newRacer));
    newRacer->graphic = (char*)malloc(MAX_CAR_LEN+1);
:
    //newRacer->graphic = &car[0]; # this is wrong.
    strcpy(newRacer->graphic,car); //copy the content to allocated memory.

    /*
     * Warning:Just i am pointing out the issue here. 
     *    strcpy may cause buffer over run. 
     *    You have to use snprintf/strncpy family to prevent buffer overrun.
     */
}

Makeуверен, что вы освободите память в своей главной.

int main() {
:
    free(newRacer->graphic);    //before free the momory for "newRacer"
    free(newRacer);
}
...