あなたのポインタはスタックにコピーされており、スタックポインタを割り当てています。ポインターを変更する場合は、ポインターをポインタに渡す必要があります。
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;
}
これで問題は解決します。
ただし、ここに他の問題があります。まず、印刷する前にポインタを間接参照しています。あなたは配列全体を印刷したいので、これは、あなたのポインタは文字の配列へのポインタで、間違っています:
cout<<"Name - "<<pszName<<endl;
あなたは今だけの最初の文字が印刷されますが何をしています。 Alsoは、あなたは、アレイを削除するdelete []
を使用する必要があります。
delete [] pszName;
大きな問題は、しかし、あなたのデザインです。
そのコードはCではなくC++であり、標準ではありません。まず、あなたが探している機能はmain
です:
int main(int argc, char * argv[])
第二に、あなたはreferences代わりのポインタを使用する必要があります。
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;
}
それはさておきを、それはあなたができる場合だけで物事を返すために、通常は良いでしょう:
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++は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;
}
したい場合は、これはすべて、簡略化することができ、もちろん場合:
#include <iostream>
#include <string>
std::string get_name(void)
{
return "Mark";
}
int main(void)
{
std::cout << "Name - " << get_name() << std::endl;
}
あなたは物事をより読みやすくするために書式設定で動作するはずです。あなたのオペレータ挟んスペースができます:ちょうど英語の単語の間にスペースなどの
cout<<"Name - "<<pszName<<endl;
cout << "Name - " << pszName << endl;
は、sodoesspacesbetweenyouroperatorsに役立ちます。 :)
+1は、直接の問題に答えて、コードの大きな問題を明らかにします。 –
ありがとうGMan。それは本当に有益だった。 – Mark
問題はありません:) – GManNickG