2016-07-21 5 views
0

だが、私はこのように設定いくつかのコードを持っているとしましょう:C言語の配列への2番目のポインタをfree()しますか?

#include <stdlib.h> 
#include <stdio.h> 

int main() { 
    char* primary = malloc(10); // main pointer to heap memory 
    char* secondary = primary;  // an alias for the main pointer 
    free(secondary); 
} 

free(secondary)primaryに割り当てられたメモリを解放しますか?

+0

'malloc()'に渡される引数はポインタ*オブジェクト*ではなくポインタ*値*です。 'primary'と' secondary'は同じ値を持つので、 'malloc()'に渡すと同じ効果があります。 –

+3

新しい最後の段落が新しい質問をします。あなたの元の質問に答えました。私は新しい質問を投稿することを自由に感じます(しかし、最初に重複をチェックします;私は以前に尋ねられたと確信しています)。 –

+0

ありがとう、余分な質問を削除しました。 – hazrmard

答えて

4

はい、free()は、malloc(),calloc()またはrealloc()のいずれかで返されたアドレスを保持するすべてのポインタで動作します。ポインタを2度実行すると危険になるので、これを行うのは少し危険です。 2つのうちの1つだけがfree()に渡されますし、後でどちらか一方でもう一度やり直すことはできません。

それはあなたがリスク説明したシナリオでは、「偶然ダングリングpoitnerを避けるために右free()にそれを通過した後NULLへのポインタを設定するため、複数回のポインタを解放しないようするのが一般的ですいずれかのポインタのみをNULLに設定します。要するに

、あなたはprimaryはダングリングポインタとしてだけsecondaryを持つほどの二倍危険である別のダングリングポインタになることを行う場合。

+1

これに加えて、何回でも 'NULL'ポインタで' free() 'を呼び出すのは無害ですが、すでに解放されているNULLでないポインタで呼び出すと重大な問題につながる可能性があります。 –

2

ポインタの値は同じです。 primarysecondaryに割り当てると、2つのポインタはmalloc()によって割り当てられたメモリの同じアドレスを指しています。 freeのどちらか一方(ただし両方ではありません)。

これは、実際にmalloc()またはfree()を自分で呼び出さない場合に特に便利です。

新しく割り当てられたメモリに文字列をコピーするPOSIX関数strdup()を考えてみます。基本的にmalloc()(または同様の機能)を呼び出します。

char[] strarr = "I am a string."; 
char* mystr = strdup(strarr); 

/* do some stuff */ 

free(mystr) 

strdup()は、おそらく変数にそのメモリ割り当て関数の結果を格納し、mystrその関数の本体内でほぼ確実にその名前はなかったです。その変数は返され、mystrに割り当てられました。次に、freeに設定する必要があります。

+0

'primary'と' secondary'は2つの異なったポインタ*オブジェクト*ですが、同じポインタ* value *を保持していて、その値は 'free()'に渡されます。 –

+0

@EdHeal: 'malloc()'ではなく 'free()'を意味しました。 (5分編集ウィンドウ内で私のエラーを指摘してくれてありがとう!) –

+0

@KeithThompson真実、「彼らは同じポインタだ」と言ったとき、同じオブジェクトのようにちょっと聞こえましたが、実際には2つの異なるオブジェクトが2つの異なる場所に割り当てられますが、そのメモリは同じ値を保持します。 –

1

次に、sizeofなどの組み込み関数を使用してポインタ配列のサイズを調べるにはどうしたらよいですか?

言語をライブラリと混同しないでください。 sizeofは機能ではなく、mallocは組み込まれていません。

Cでは、sizeofは、演算子であり、関数ではありません。あなたはsizeofに変数を渡しますが、表現していないので、

size_t size = sizeof(void*); 

:(。あなたはそれを宣言する必要はないことに注意してください)あなたのようなことを言うことができます。式には型があり、すべての型にはサイズがあります。greetingはタイプchar[6]を持っているので

あなたは

char greeting[] = "hello"; 
size_t len = sizeof greeting; 

len言い6です。 sizeofは演算子であるため、かっこは不要です。括弧は通常、オペレータ優先順位の問題を避けるためにのみ使用されます。

C標準ライブラリには、割り当てられたブロックのサイズを返すためにmallocfree、ない(我々はそれを呼び出すもの)size_of関数を定義します。実装にこのような機能を提供できます。ヒープを維持するのと比べて、技術的には簡単です。

なぜ「size_of」が一般的に提供されていないのですか?それほど必要ではないので、私は言うだろう。 memsetのような関数はメモリ全体のブロックで動作することがありますが、部分ブロックに対しても便利です。ブロック内のバイト数は、それに含まれる上位要素の数(struct、さらにはちょうどint)よりも面白くないことがよくあります。 10年後に設計されたC++ STLアルゴリズムもコレクション全体では動作しませんが、開始引数は&です。

関連する問題