In xau bi loi c++

#include <iostream>
#include <string.h>
using namespace std;
char * xinChao( char name[50])
{
	char mang[100] ="Hello, ";
	char *result;
	strcat(mang, name);
	result = mang;
return result;
}
int main ()
{
	char name[50] = "You";
	cout<< xinChao(name);
	return 0;
}

Em không hiểu tại sao kết quả in ra lại bị lỗi, mong mọi người giải đáp giùm ,cám ơn mọi người !

em đã khai báo thư viện iostream và string.h ạ.

Chuỗi C++ là string chứ ko phải char*. char* là con trỏ tới 1 ký tự.

#include <iostream>
#include <string>
using namespace std;
string xinChao(string name)
{
	string hello ="Hello, ";
	return hello + name;
}
int main ()
{
	string name = "You";
	cout<< xinChao(name);
}
1 Like

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 mangresult 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;
}
2 Likes

Em hiểu rồi ,em cảm ơn anh nhiều ạ :smiley:

Dạ vâng , em cảm ơn anh ạ :smiley:

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