2016-11-30 8 views
-2

これは私のコードの一部です:なぜreallocの後でも配列の長さが同じですか?

array = (int *) malloc(5*sizeof(int)); 

それが初期化され、いくつかの値を持っており、私はより多くのクリアランスのために、ここで、このステップをスキップしています。

memmove(array, array + 1, 4*sizeof(int)); 
array = realloc(array, 4*sizeof(int)); 

ここで達成したいのは、配列の最初のメンバーを削除し、配列全体を1つ左に移動することです。

strlen(array); 

が、私はそれはreallocのように思える値5を取得し、私も後にあるべき配列の5番目の要素を、印刷しようとするので、正常に動作しません:私は使用して、配列の長さをチェックしてみてくださいそれでもとき配列範囲からrealloc、それは以前に与えた値を出力します。どのように可能ですか?

誰かが私が間違っている箇所を教えてもらえますか?何が欠けていますか?

+0

1)ポインタは配列ではありません。 2)Cには明確な文字列型がありません。 3)あなたのCの本は、一般的に 'strlen'とCの文字列について何を言っていますか?簡単な検索で何が見つかりましたか? – Olaf

+0

'int'の配列に見えるものに' strlen'を適用しているのはなぜですか?この場合、 'strlen'は何をすると思いますか?そして、コンパイラは 'strlen(配列)'式について何を教えてくれましたか? – AnT

答えて

2

strlenは、NULで終了する文字列の長さを計算します。それは運が5です(ある点でゼロに遭遇します):未定義の振る舞いです。

そしてサイズはバイトです。配列のサイズは5*sizeof(int)なので、実際のサイズはintに応じて20または40になります。とにかくあなたが探しているものではありません。 (!それを格納別に)mallocまたはreallocによって割り当てられたブロックの「長さ」を伝える方法はありません

(しかし、あなたのrealloc操作は有効です)

注:この間違いのバリエーションarrayはポインタであり配列ではないので、ポインタ型のサイズであるsizeof(array)に頼ることになります。

関連する問題