Il puntatore viene copiato nello stack e si assegna il puntatore dello stack. È necessario passare un puntatore a puntatore se si desidera modificare il puntatore:
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;
}
Ciò risolverà il problema.
Tuttavia, ci sono altri problemi qui. In primo luogo, stai dereferendo il puntatore prima di stampare. Questo non è corretto, il puntatore è un puntatore a un array di caratteri, in modo che si desidera stampare l'intero array:
cout<<"Name - "<<pszName<<endl;
quello che hai ora sarà solo stampare il primo carattere. Also, è necessario utilizzare delete []
per eliminare un array: problemi
delete [] pszName;
più grandi, però, sono nel vostro disegno.
Quel codice è C, non C++, e anche in questo caso non è standard. In primo luogo, la funzione che stai cercando è main
:
int main(int argc, char * argv[])
In secondo luogo, è necessario utilizzare references invece di puntatori:
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;
}
A parte questo, di solito è meglio tornare appena le cose, se possibile :
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'è qualcosa che rende tutto questo migliore. C++ ha un 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;
}
Se Naturalmente tutto questo può essere semplificata, se si vuole:
#include <iostream>
#include <string>
std::string get_name(void)
{
return "Mark";
}
int main(void)
{
std::cout << "Name - " << get_name() << std::endl;
}
si dovrebbe lavorare sulla formattazione per rendere le cose più leggibile. Gli spazi trascorre i vostri operatori aiuta:
cout<<"Name - "<<pszName<<endl;
cout << "Name - " << pszName << endl;
Proprio come spazi tra le parole inglesi aiuta, sodoesspacesbetweenyouroperators. :)
+1, risponde al problema diretto e illumina il problema più grande con il codice. –
Grazie GMan. E 'stato davvero informativo. – Mark
Nessun problema :) – GManNickG