Fix bug for C, C++

Giúp mình với, mình chạy chương trình nhưng không in được:

  • nếu b= likes(0,names) thì có in
  • nhưng nếu b = likes(1,names) thì không in
#include<stdio.h>
#include<string.h>
char *likes(size_t n, const char *const names[n]) {
    static char *result;
    char x[100];
    if (n==0)
        result="no one likes this";
    if(n==1){
        strcpy(x, names[0]);
        strcat(x," likes this");
        result=x;
    }
    return result;
}
int main(){
char *b;
const char *const names[4] = {"Alex", "Jacob", "Mark", "Max"};
b=likes(1,names);
printf("%s", b);
return 0;
}

Phần tử bên trong char x[100] đã bị “giải phóng” (de-allocated) rồi nên khi bạn gọi printf("%s", b); thì lúc này b đang trỏ đến 1 object đã bị xóa rồi nên b giờ không có gì cả.

x lúc này là local variable và local variable sẽ bị “giải phóng” sau khi ra khỏi scope.
Bạn có thể kiểm tra địa chỉ của từng phần tử bên trong x thì sẽ thấy những phần tử đấy được cấp phát (allocate) trên stack bằng cách thử khải báo thêm 1 hoặc 2 biến local nữa, rồi thử in địa chỉ của 2 biến vừa khai báo với địa chỉ của x[0] thì bạn sẽ thấy nó gần nhau.

Giả sử bạn thêm static vào x thì mọi chuyện sẽ khác: static char x[100]. Cách này chỉ là chỉ ra việc object trong x[100] bị de-allocated thôi, còn implement thế nào cho hiệu quả thì thùy bạn.

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