Con trỏ của bạn đang được sao chép vào ngăn xếp và bạn chỉ định con trỏ ngăn xếp. Bạn cần chuyển con trỏ đến con trỏ nếu bạn muốn thay đổi con trỏ:
void SetName(char **pszStr)
{
char* pTemp = new char[10];
strcpy(pTemp,"Mark");
*pszStr = pTemp; // assign the address of the pointer to this char pointer
}
int _tmain(int argc, _TCHAR* argv[])
{
char* pszName = NULL;
SetName(&pszName); // pass the address of this pointer so it can change
cout<<"Name - "<<*pszName<<endl;
delete pszName;
return 0;
}
Điều đó sẽ giải quyết được vấn đề của bạn.
Tuy nhiên, có những vấn đề khác ở đây. Thứ nhất, bạn là dereferencing con trỏ của bạn trước khi bạn in. Đây là không chính xác, con trỏ của bạn là một con trỏ đến một mảng kí tự, vì vậy bạn muốn in ra toàn bộ mảng:
cout<<"Name - "<<pszName<<endl;
Những gì bạn có bây giờ sẽ chỉ in các ký tự đầu tiên. Also, bạn cần phải sử dụng delete []
để xóa một mảng: vấn đề
delete [] pszName;
Lớn hơn, tuy nhiên, trong thiết kế của bạn.
Mã đó là C, không phải C++ và thậm chí sau đó không phải là tiêu chuẩn. Thứ nhất, các chức năng bạn đang muốn tìm main
:
int main(int argc, char * argv[])
Thứ hai, bạn nên sử dụng references thay vì con trỏ:
void SetName(char *& pszStr)
{
char* pTemp = new char[10];
strcpy(pTemp,"Mark");
pszStr = pTemp; // this works because pxzStr *is* the pointer in main
}
int main(int argc, char * argv[])
{
char* pszName = NULL;
SetName(pszName); // pass the pointer into the function, using a reference
cout<<"Name - "<<pszName<<endl;
delete pszName;
return 0;
}
Bên cạnh đó, nó thường là tốt hơn để chỉ trả lại mọi thứ nếu bạn có thể :
char *SetName(void)
{
char* pTemp = new char[10];
strcpy(pTemp,"Mark");
return pTemp;
}
int main(int argc, char * argv[])
{
char* pszName = NULL;
pszName = SetName(); // assign the pointer
cout<<"Name - "<<pszName<<endl;
delete pszName;
return 0;
}
Có điều gì đó khiến mọi thứ trở nên tốt hơn. C++ có string class:
std::string SetName(void)
{
return "Mark";
}
int main(int argc, char * argv[])
{
std::string name;
name = SetName(); // assign the pointer
cout<<"Name - "<< name<<endl;
// no need to manually delete
return 0;
}
Nếu khóa học này có thể được đơn giản hóa tất cả, nếu bạn muốn:
#include <iostream>
#include <string>
std::string get_name(void)
{
return "Mark";
}
int main(void)
{
std::cout << "Name - " << get_name() << std::endl;
}
Bạn nên làm việc trên định dạng của bạn để làm cho mọi việc dễ đọc hơn. Dấu cách giữa các toán tử của bạn sẽ giúp:
cout<<"Name - "<<pszName<<endl;
cout << "Name - " << pszName << endl;
Giống như khoảng cách giữa các từ tiếng Anh giúp, sodoesspacesbetweenbộ điều khiển. :)
+1, trả lời trực tiếp vấn đề và chiếu sáng vấn đề lớn hơn với mã. –
Cảm ơn GMan. Nó thực sự mang tính thông tin. – Mark
Không phải là vấn đề :) – GManNickG