2009-08-01 31 views
10

Tôi là một newbie đến C++. Tôi đang cố gắng để có một con trỏ char như là một tham số ra cho một chức năng. Nhưng những thay đổi được thực hiện trong chức năng không được phản ánh trong chức năng chính. Tôi đang làm gì sai?Làm thế nào để có một con trỏ char như một tham số ngoài cho hàm C++

void SetName(char *pszStr) 
{ 
    char* pTemp = new char[10]; 
    strcpy(pTemp,"Mark"); 
    pszStr = pTemp; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    char* pszName = NULL; 
    SetName(pszName); 
    cout<<"Name - "<<*pszName<<endl; 
    delete pszName; 
    return 0; 
} 

Trả lời

48

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. :)

+2

+1, trả lời trực tiếp vấn đề và chiếu sáng vấn đề lớn hơn với mã. –

+0

Cảm ơn GMan. Nó thực sự mang tính thông tin. – Mark

+0

Không phải là vấn đề :) – GManNickG

2

Những gì bạn đang viết không phải là C++, nhưng mã C sử dụng mới thay vì malloc, và xóa thay vì miễn phí. Nếu bạn thực sự muốn viết mã C++, hãy bắt đầu lại. Đọc một cuốn sách như Accelerated C++, nó sẽ dạy bạn thành ngữ C++ hiện đại.

+0

Điều này không chính xác trả lời câu hỏi, nhưng đó là một gợi ý tốt ... – Zifre

+2

Dòng cuối cùng của câu hỏi là "Tôi đang làm gì sai?" Tôi nghĩ rằng câu trả lời của tôi địa chỉ chính xác này. –

+0

Cảm ơn bạn đã đề xuất. Tôi chắc chắn sẽ đi qua cuốn sách. – Mark

4

Vì bạn được gắn thẻ là C++, tại sao không vượt qua tham chiếu chuỗi :: std và điền vào?

void GetName(std::string &strName) 
{ 
    strName = "Mark"; 
} 

Hoặc đơn giản là trả lại một std :: string:

std::string GetName2() 
{ 
    return "Mark"; 
} 

Và gọi nó như vậy

std::string strName, strName2; 
GetName(strName); 
strName2 = GetName2(); 
assert(strName == "Mark"); 
assert(strName2 == "Mark"); 
//strName.c_str() returns the const char * pointer. 

Sau đó, bạn không cần phải lo lắng về việc giải phóng bất kỳ bộ nhớ.

+0

Và đừng quên #include :) –

7

Bạn cũng có thể sử dụng tham chiếu đến con trỏ trong trường hợp này. Ngoài ra, bạn có thể muốn biết 2 lỗi khác có trong mã ban đầu (xem nhận xét của tôi trong đoạn mã).

void SetName(char *& pszStr) 
{ 
    char* pTemp = new char[10]; 
    strcpy(pTemp,"Mark"); 
    pszStr = pTemp; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    char* pszName = NULL; 
    SetName(pszName); 

    // Don't need '*' in front of pszName. 
    cout<< "Name - " << pszName << endl; 

    // Needs '[]' to delete an array. 
    delete[] pszName; 
    return 0; 
} 
+0

Rất thích việc xóa mảng. – GManNickG

Các vấn đề liên quan