2016-08-05 2 views
0

私は24 byteの大きさと、そのような配列を持っています。そして、私は、配列の各要素に\0を割り当てることによって、メモリからこの配列をクリアしてみてくださいchar *のメモリ配列を消去するには?

char* arr[3] = {"CERN", "0", "ALK"}; 
printf("%ld\n", sizeof(arr)); 

for (size_t i = 0; i < sizeof(arr)/ sizeof(char*); ++i) { 
    arr[i] = '\0'; 
} 

しかし、私が確認したいとき配列のサイズは、それでも私を与える24 byte

printf("%ld\n", sizeof(arr)); 
> 24 

これを完全にクリアする方法メモリからの返り値sizeof(arr)0になるでしょうか?

+3

これは静的な配列なので、変数をメモリから削除することはできません... – m13r

+0

'sizeof(arr)/ sizeof(char *);' - > 'sizeof(arr)/ sizeof(arr [0]); ' – LPs

+0

'arr [i] =' \ 0'' - >' arr [i] = NULL' – LPs

答えて

1

あなたは配列にゼロを割り当てましたが、それだけです。あなたは変更されていない(そして、あなたがmalloc()しなかったので)配列に割り当てられたメモリの量は、その中のそのデータだけをクリアした。

3

sizeof(arr)は、3つのサイズのchar*です。各ポインタを0に設定しても変更されません。

sizeof(arr)のメモリからこの配列を完全にクリアするには、 に0を指定しますか?

自動ストレージに割り当てられたアレイを「クリア」する方法はありません。あなたは本当にそれを "クリア"する必要はありません。

%zuを使用して、size_tの値を出力する必要があります。これは、sizeofの演算子の結果です。不正な書式指定子を使用すると、undefined behaviourとなります。

+0

アレイをクリアする必要がなければ...メモリリークはどうですか? –

+1

メモリリークは、 'malloc()'や 'calloc()'や 'realloc()'や 'strdup()のような動的に割り当てられたメモリへのポインタを返す関数など、 ) '。あなたのコードにはメモリリークはありません。配列 'arr'は自動ストレージ(別名* stack *)に割り当てられた3つのポインタを持ち、ポインタのそれぞれは*文字列リテラル*を指しています。あなたは自分自身のためにメモリを割り当てていません。 –

2

いいえ、いいえ、いいえ。いくつかの異なる問題がここにあります

  1. あなたは、メモリのブロックを解除したい場合は、文字列をゼロにしたい場合は、あなたがする必要があるすべては最初の文字を設定されているmemset()

  2. を使用します〜null:arr[0] = 0;

  3. sizeof operatorには、配列のサイズが表示されます。

  4. strnlen()には、文字列の長さが分かります。あなたは、配列のための3つのバイトを割り当てられてきた場合であっても

、文字列の実際の長さは0、1または2

かもしれないそれは「3」になることはありません...あなたが必要とするので、あなたのターミネータのための少なくとも1バイト。

-1

あなたはそれが静的および動的に割り当てられたメモリの違いを、この記事を見て説明するかもしれないので:

What and where are the stack and heap?

+1

これは答えではありません。これはコメントです。 –

+0

それは概念を説明しているので答えです。 OPが概念を理解している場合、彼は質問が意味をなさないと理解する。 – murphy

+0

これはリンクのみの回答であり、回答としては何も追加しません。 –

1

どうsizeof(arr)0を与えることをメモリから完全にクリアこの配列に?

あなたの宣言では可能ではありません。

0 - NULLでないarrの項目数を考え出すには、別のロジックが必要です。次いで

int my_own_array_size(char* arr[], int numElements) 
{ 
    int count = 0; 
    for (int i = 0; i < numElements; ++i) 
    { 
     if (arr[i] != NULL) 
     ++count; 
    } 
    return count; 
} 

としてそれを使用する:

int count = my_own_array_size(arr, 3); 
1

するchar * ARR [3] = { "CERN"、 "0"、 "ALK"}。 ARRここ

  • 3つのチャーポインタの配列です。各要素のサイズは8バイト(64ビットシステム)です。
  • だからARRのサイズは常に24(3 *のはsizeof(ボイド*))であろうかかわらず、さらに文字として解釈又はstring.Thisを有しているポインタ(すなわちアドレスやNULL、によって参照されるメモリのarrサイズ)
  • 以上forループはNULLへのポインタのみを初期化します。

sizeof(arr)が0になるメモリからこの配列を完全にクリアするにはどうすればよいですか?

これは静的割り当て(自動変数またはグローバル変数のいずれか)です。 arrに割り当てられたメモリはクリアできません。

注:この場合"CERN"、 "0"、 "ALK"はおそらく、読み取り専用セグメントに格納されています。

関連する問題