Twój wskaźnik jest kopiowany na stos i przypisujesz wskaźnik stosu. Jeśli chcesz zmienić wskaźnik, musisz przekazać wskaźnik do wskaźnika:
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;
}
To rozwiąże Twój problem.
Istnieją jednak inne problemy. Najpierw wyłuskujesz wskaźnik przed wydrukowaniem. Jest to błędne, wskaźnikiem jest wskaźnik do tablicy znaków, więc chcesz wydrukować całą tablicę:
cout<<"Name - "<<pszName<<endl;
Co masz teraz będzie po prostu wydrukować pierwszy znak. Also, trzeba użyć delete []
usunąć tablicę:
delete [] pszName;
większych problemów, choć są w projekcie.
Ten kod to C, nie C++, a nawet wtedy nie jest standardowy. Po pierwsze, funkcja szukasz jest main
:
int main(int argc, char * argv[])
Po drugie, należy użyć references zamiast wskazówek:
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;
}
Poza tym, to zwykle lepiej po prostu wrócić rzeczy, jeśli potrafisz :
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;
}
Jest coś, co czyni to wszystko lepszym. C++ ma 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;
}
Jeśli Oczywiście to wszystko może być uproszczone, jeśli chcesz:
#include <iostream>
#include <string>
std::string get_name(void)
{
return "Mark";
}
int main(void)
{
std::cout << "Name - " << get_name() << std::endl;
}
Należy pracować na formatowaniu, aby rzeczy bardziej czytelny. Przestrzenie pomiędzy nimi swoimi operatorami pomaga:
cout<<"Name - "<<pszName<<endl;
cout << "Name - " << pszName << endl;
Podobnie jak w przestrzeniach pomiędzy angielskimi słowami pomaga, sodoesspacesbetweenyouroperators. :)
+1, odpowiada na bezpośredni problem i wyświetla większy problem z kodem. –
Dzięki GMan. To było naprawdę pouczające. – Mark
Nie ma problemu :) – GManNickG