ポインタとメモリの大事について(面接問題)
Cポインタとメモリについて
Cのポインタの使用とメモリの割り当てに対して、私はすべてのCプログラマーが使用する時すべて心がびくびくしていると思って、少なくとも私はこのようにします.今私はついに自分の聖書を見つけて、それは林鋭博士が彼の<<高品質C/C++プログラミング>>の中で話した知識で、ここで林鋭先生がこの本を書いてくれたことに感謝して、私と同じようにpointer&&memoryに恐怖を感じている人に希望を見つけさせました.くだらないことを言わないで、テーマに入ります:(1)静的記憶領域から割り当てます.メモリはプログラムのコンパイル時にすでに割り当てられており、この内にプログラムが存在する全実行期間が存在します.たとえばグローバル変数、static変数です.(2)スタック上に作成する.関数を実行すると、関数内のローカル変数のメモリセルがスタック上に作成され、関数の実行が終了すると、これらのメモリセルが自動的に解放されます.スタックメモリ割り当て演算はプロセッサの命令セットに組み込まれており,効率は高いが,割り当てられたメモリ容量は限られている.(3)スタックからの割当て,動的メモリ割当てとも呼ばれる.プログラムは実行時にmallocまたはnewで任意のメモリ数を申請し、プログラマー自身がfreeまたはdeleteでメモリをいつ解放するかを担当します.ダイナミックメモリの生存期間は、柔軟性に優れていますが、最も問題があります.
c++プログラミングネットワーク
Cのポインタの使用とメモリの割り当てに対して、私はすべてのCプログラマーが使用する時すべて心がびくびくしていると思って、少なくとも私はこのようにします.今私はついに自分の聖書を見つけて、それは林鋭博士が彼の<<高品質C/C++プログラミング>>の中で話した知識で、ここで林鋭先生がこの本を書いてくれたことに感謝して、私と同じようにpointer&&memoryに恐怖を感じている人に希望を見つけさせました.くだらないことを言わないで、テーマに入ります:(1)静的記憶領域から割り当てます.メモリはプログラムのコンパイル時にすでに割り当てられており、この内にプログラムが存在する全実行期間が存在します.たとえばグローバル変数、static変数です.(2)スタック上に作成する.関数を実行すると、関数内のローカル変数のメモリセルがスタック上に作成され、関数の実行が終了すると、これらのメモリセルが自動的に解放されます.スタックメモリ割り当て演算はプロセッサの命令セットに組み込まれており,効率は高いが,割り当てられたメモリ容量は限られている.(3)スタックからの割当て,動的メモリ割当てとも呼ばれる.プログラムは実行時にmallocまたはnewで任意のメモリ数を申請し、プログラマー自身がfreeまたはdeleteでメモリをいつ解放するかを担当します.ダイナミックメモリの生存期間は、柔軟性に優れていますが、最も問題があります.
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
Test ?
: 。
GetMemory ,
Test str NULL。
strcpy(str, "hello world");
。
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
Test ?
: 。
GetMemory “ ”
, NULL,
, 。
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
Test ?
:
(1) hello
(2)
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
Test ?
: ,
, 。
free(str); ,str ,
if(str != NULL) 。
**********************************************************************************************
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(sizeof(char) * num);
}
void Test2(void)
{
char *str = NULL;
GetMemory2(&str, 100); // &str, str
strcpy(str, "hello");
cout<< str << endl;
free(str);
}
, “ ”. “ ” , 。
char *GetMemory3(int num)
{
char *p = (char *)malloc(sizeof(char) * num);
return p;
}
void Test3(void)
{
char *str = NULL;
str = GetMemory3(100);
strcpy(str, "hello");
cout<< str << endl;
free(str);
}
**********************************************************************************************
, return
。 return “ ” ,
char *GetString(void)
{
char p[] = "hello world";
return p; //
}
void Test4(void)
{
char *str = NULL;
str = GetString(); // str
cout<< str << endl;
}
Test4, str = GetString str NULL ,
str “hello world” 。
char *GetString2(void)
{
char *p = "hello world";
return p;
}
void Test5(void)
{
char *str = NULL;
str = GetString2();
cout<< str << endl;
}
Test5 , GetString2 。
GetString2 “hello world” , ,
。 GetString2, “ ” 。
c++プログラミングネットワーク