Vấn đề là ở hàm xinChao. Trong hàm xinChao, các biến như result
, mang[100]
đều được lưu trên stack, nó chỉ có phạm vi trong hàm xinChao. Khi hàm xinChao kết thúc nó trả về địa chỉ của mang
, nhưng lúc này mang
và result
bị hủy để trả lại vùng nhớ trên stack cho hàm hoặc chương trình khác sử dụng, thành ra xinChao lúc này mang địa chỉ của 1 vùng nhớ mà không xác định rõ giá trị, dẫn đến lỗi segment fault hoặc dẫn tới kết quả không xác định như trường hợp của bạn. Để khắc phục trong hàm xinChao bạn khai báo static
cho mang
tuy nhiên đây là 1 “bad practice”.
cách tốt hơn đó là sử dụng vùng nhớ Heap, như sau:
char* xinChao( char name[50])
{
char* mang =new char[100]; //cap phat 1 vung nho 100 phan tu kieu char (nam tren Heap)
strcpy(mang,"Hello, ");
strcat(mang, name);
return mang;
}
int main ()
{
char *result;
char name[50] = "You";
result=xinChao(name); //result tro den vung nho da duoc cap phat tren Heap
cout<<result<<endl;
delete [] result; //xoa vung nho duoc cap phat
return 0;
}
hoặc:
char* xinChao( char name[50])
{
char* mang =(char*)malloc(100*sizeof(char)); //cap phat 1 vung nho 100 phan tu kieu char (nam tren Heap) nho include them stdlib.h
strcpy(mang,"Hello, ");
strcat(mang, name);
return mang;
}
int main ()
{
char *result;
char name[50] = "You";
result=xinChao(name); //result tro den vung nho da duoc cap phat tren Heap
cout<<result<<endl;
free(result); //xoa vung nho duoc cap phat
return 0;
}