0

uは以下のメモリが1バイトのみダブルポインタの動的メモリ割り当ては、サイズは1つではありますが、文字列を1バイト以上保持できます。これは可能ですか?

するmallocの大きさを与えているにもかかわらず、このような大きな文字列を保持するために割り当てますどのように説明することができますが、それが機能しているかのようにかなり混乱しています。

+0

1バイトを割り当てていません。おそらく4または8バイトのポインタを割り当てています。次に、他の場所にすでに存在するconst文字列にその文字列を割り当てます。 –

+0

なぜ 'malloc()'が "1バイトのみ"を割り当てると思いますか? – babon

+0

「なぜこのプログラムは明らかに無効ですか?一般的に、この種の質問は生産的ではありません。 「未定義の動作」をお読みください。 (この特定のプログラムは無効かもしれないし、そうでないかもしれない)。 –

答えて

3

1バイトを割り当てていません。

sizeof(char*)*lenは、sizeof (char *)、つまり文字ポインタのサイズに簡略化できます。

str[0] = "This is a string"; 

だけで行います。これは、この4か

8.次に、あなただけの"This is a string"リテラル文字列の値がどこリテラルが表示され、メモリ内のアドレスであり、そこに単一のポインタを格納し、一般的なので、単一ポインタサイズの割り当てstr[0](ポインタ)には、文字はコピーされません。ちょうど1つのポインタはあなたが割り当てたスペースの大きさなので、うまくいきます。

0

割り当てようとしているものを割り当てていません。

あなたは

char **str; 

が、これは1つの文字列を保持できる変数ではないと言います。これは、複数の文字列の配列を保持できる変数です。

あなたは

int len = 1; 
str = malloc(sizeof(char*) * len); 

を言うときあなたは1つの文字列を保持するために、最大strを設定しています。つまり、この場合、lenは文字列の長さではなく文字列の数をカウントします。

は、その後、あなたが一定の文字列へのポインタでstrの1つの文字列に記入されている

str[0] = "This is a string"; 

を言うとき。コンパイラは、あなたのために文字列定数のためのメモリを割り当てたので、そうする必要はありません。この場合、ポインタをコピーするだけです。あなたは文字列全体をコピーしていないので、それ以上のメモリを割り当てる必要はありません。あなたはちょうどあなたが全体の文字列にメモリを割り当て、実際に文字列全体をコピーしたい場合は

char *p; 
p = "This is a string"; 

が、それは次のようになります言った場合、それは次のようにです:

const char *string_to_copy = "This is a string"; 
str[0] = malloc(strlen(string_to_copy) + 1);  /* +1 for \0 */ 
if(str[0] == NULL) exit(1); 
strcpy(str[0], string_to_copy); 

そして、あなたがしたい場合複数の文字列を保持するにはstrを使用してください。

len = 4; 
str = malloc(sizeof(char*) * len); 
if(str == NULL) exit(1); 
str[0] = "This"; 
str[1] = "is"; 
str[2] = "a"; 
str[3] = "test."; 
関連する問題