Строка есть, но не напечатана - PullRequest
0 голосов
/ 06 мая 2018

У меня довольно интересная проблема, наверное. Я пытаюсь реализовать стек в C. Вот мой заголовок и файл реализации (я только реализовал Push пока):

my.h:

typedef struct {
    char type[3];
    int nrOfOpr;
    int num;
} BizarreNumber_t;

struct stackNode {
    BizarreNumber_t data;
    struct stackNode *nextPtr;
};

// stack related
extern void push(struct stackNode *topPtr, BizarreNumber_t info);

my.c:

void push(struct stackNode *topPtr, BizarreNumber_t info){
    struct stackNode *newTop = malloc(sizeof(struct stackNode));
    struct stackNode oldTop = *topPtr;
    newTop->data=info;
    newTop->nextPtr=&oldTop;
    *topPtr=*newTop;
// printf("topPtr->next->data: %s\n", topPtr->nextPtr->data.type);
//
// printf("oldTop->data: %s\n", oldTop.data.type);
// printf("newTop->data: %s\n", newTop->data.type);
// printf("topPtr->data: %s\n", topPtr->data.type);
}

Наконец, это мой main.c:

int main(int argc, char const *argv[]) {
    struct stackNode* stackHead=malloc(sizeof(struct stackNode));

    BizarreNumber_t a={"sa",1,1};
    BizarreNumber_t b={"as",2,2};

    stackHead->data=a;
    stackHead->nextPtr=NULL;

    printf("%s\n", stackHead->data.type);
    push(stackHead,b);

    printf("%s\n", stackHead->nextPtr->data.type);//HERE!!!
    return 0;
}

В основном, строка, которую я написал "ЗДЕСЬ !!!" неправильно дает истинный вывод. На самом деле это ничего не дает. Интересно, что дает правильный вывод:

printf("%c\n", stackHead->nextPtr->data.type[0]);

Я пытался распечатать каждый символ в строке, результаты говорят, что String приходит в порядке. Но я не вижу. Почему это так?

1 Ответ

0 голосов
/ 06 мая 2018

stackHead - локальная переменная, созданная в функции main(). Какие бы изменения или изменения не были сделаны с помощью метода stackHead в push(), это не повлияет на метод main(), так как он будет вызываться только по значению.

Вместо этого передайте адрес метода stackHead в push() как

push(&stackHead,b); /* pass the address of stackhead */

И соответственно изменить определение push().

 void push(struct stackNode **topPtr, BizarreNumber_t info){
        struct stackNode *newTop = malloc(sizeof(struct stackNode));
        newTop->data = info;
        newTop->nextPtr = *topPtr; /*new node next make it to head node */
        *topPtr=newTop; /*update the head node */
 }
...