Không hiểu điều gì đang diễn ra với đoạn code C. Nhờ các bác giải thích giùm!

Các bác chỉ giúp em tại sao Lặp với while() trong hàm main() lại chỉ in ra nội dung của struct cuối cùng, còn lặp “bằng tay” thì lại in “đúng” không ạ?
Em chẳng thể tìm ra lỗi ở đâu. có khi gần 2h rồi :disappointed_relieved:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#pragma pack(1)


typedef struct island
{
      char *name;
      char *open;
      char *close;
      struct island *next;
}island;

void display(island *start)
{
    island *i = start;
    for (;i != NULL  ; i = i->next )
    {
        if( i->next != NULL)
            printf("Island name: %s, Open: %s, Close: %s, Next island: %s\n", i->name, i->open, i->close, (i->next->name) );
        else
            printf("Island name: %s, Open: %s, Close: %s, Next island: %s\n", i->name, i->open, i->close, i->next);
    }

}
void addIsland(island* nI, island* start )
{
    island *i = start;

    for (;i != NULL  ; i = i->next )
    {
        if(i->next == NULL)
        {
            i->next = nI;
            return;
        }

    }
}

island * create(char* name)
{
    island * i = malloc(sizeof(island));
    i->name = name;
    i->open = "09:15";
    i->close ="17:30";
    i->next = NULL;
    return i;
}

int main()
{

    island amity = {"Amity", "09:00", "17:15", NULL};  


    char newName[100];
    island* new_island = NULL;
    int n = 0;
    printf("\n Lap voi While: \n");
    while(n < 4)
    {
        printf("\n\n");
        sprintf(newName,"%d", n); // Convert biến
        new_island = create(newName);
        addIsland(new_island, &amity);
        display(&amity);
        n++;                        // Tự động thay tên biến

    }
     printf("\n lap bang tay: \n");
    {  // Lặp bằng tay :))

        printf("\n\n");
        new_island = create("0");
        addIsland(new_island, &amity);
        display(&amity);

        printf("\n\n");
        new_island = create("1");
        addIsland(new_island, &amity);
        display(&amity);

        printf("\n\n");
        new_island = create("2");
        addIsland(new_island, &amity);
        display(&amity);

        printf("\n\n");
        new_island = create("3");
        addIsland(new_island, &amity);
        display(&amity);
    }


    return 0;
}

Mình đang “ngâm” thì lại đẻ ra 1 câu hỏi nữa:

Nếu là pointer name khi mang địa chỉ đi share cho khắp nơi mỗi khi hàm island * create(char* name) được gọi là 1 lỗi. Do name không được cấp phát địa chỉ và bộ nhớ riêng mà chỉ dùng 1 địa chỉ để share ( đúng ko ta? :confused:). Thì tại sao gọi cùng hàm trong while() và ngoài while() lại cho kết quả khác nhau dữ vậy???

Bạn thử cấp phát lại xem, khi khai báo ấy:
island* new_island = new island;

printf cái này ra là biết. sao không gán trực tiếp luôn?

new ở trong thư viện nào của C vậy bạn? Hình như ko có

Xin lỗi, mình nhầm sang C++.
Bạn sửa lại như bác trên nói xem sao

newName không vấn đề gì bạn ạ.
Mình tìm đc cách sửa lỗi trên để có code chạy như ý định. Nhưng đoạn code trên là để cho câu hỏi mình chưa giải thích được ấy.

Sorry các bạn! Lỗi này là do bụng đói. Đươc ăn nên đỡ ngâu hơn rồi :smile_cat:

Do trong while() được truyền string được khai báo để loop ( char array), còn ngoài while() truyền trực tiếp string ( bằng tay) nên nó khác nhau.

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?