2016-05-25 4 views
0

は私はこのような5つの整数要素の配列を初期化言う:Cでmallocされた配列の最後の要素を解放する方法は?

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

for (int i = 0; i < 5; i++) { 
    Q[i] = i; 
} 

アレイがどのように見える:{0、1、2、3、4}。 は今は1つの位置によってすべてに沿ってシフトした場合:#は、いくつかのガベージ値は{1、2、3、4、#}:

Q++; 

アレイのように見えます。

最後の要素を解放して配列に格納されないようにする方法はありますか?

私はこの試みた:

free(Q[4]); 

をしかし、私は自由()のみQ.

に割り当てられたメモリのチャンク全体を操作できるので、これは動作しません知っているに良い方法はあります一緒にすべてをシフト?結果の配列は{1、2、3、4}のようになります。

シフトするたびにrealloc()を実行することをお勧めしますか?

+0

はい、 'Q ++'を実行した場合、 'size - 'を調整するよりです。あなたは記憶の塊を持っており、アクセス方法を制御します。 – StoryTeller

+6

'Q ++'の後、 'Q [4]'は "ガベージ"を含んでいません。アクセスは**未定です**。 – EOF

+2

[realloc](http://www.tutorialspoint.com/c_standard_library/c_function_realloc.htm)を使用することができます。 – LPs

答えて

5

realloc()は、割り当てられたメモリチャンクのサイズを変更することができます。これは、配列の任意の要素を "フリー"するのに使用することはできませんが、最後には1つだけを使用することに注意してください。

これを行うにはどうすればいいかは、いくつかの要因に左右されます。

1

あなたはきっとところであなたは

を言うとき、配列がどのように見えることに注意して取るrealloc

を使用することができ、配列の最後の要素についてTaliking:{1、2、3、4、#}、#ごみの価値です。

あなたは間違っており、定義されていない動作も同様にthis SO answerで説明されています。

だから、シフト値を左のループがQ[4] = Q[5];

2

を行うには持っていない配列が変更されていないあなたは、Qは++、それはまだ5個の値0,1,2,3,4が含まれていない場合には、それだけではQであります配列の2番目の要素を指しています。

割り当てられたメモリのサイズを変更したい場合は、スコットが言ったように、ブロックreallocを実行しますが、ヒープメモリを処理するにはコストがかかります。

配列の要素数を把握したい場合は、Qが最初の要素を指し示したままになり、いくつの整数があるかを示すsize変数を持つようにします。または、別のデータ構造を使用して整数を保持することもできます。整数のリンクリストを使用すると、整数の追加や削除が容易になります。

1

配列内の要素を移動するには、memmove()を使用できます。

#include <stdio.h> 
#include <string.h> 

int main(void) 
{ 
    int d_init[] = {0, 1, 2, 3, 4}; 

    size_t s = sizeof d_init/sizeof *d_init; 
    int d[s]; 

    /* Fill d */ 
    memcpy(d, d_init, s * sizeof *d); 

    for (size_t i = 0; i < s; ++i) 
    printf("%d ", d[i]); 
    puts("\n"); 

    /* shift one to the left */ 
    memmove(d, d + 1, (s - 1) * sizeof *d); 

    for (size_t i = 0; i < s; ++i) 
    printf("%d ", d[i]); 
    puts("\n"); 


    /* shift two to the right */ 
    memmove(d + 2, d, (s - 2) * sizeof *d); 

    for (size_t i = 0; i < s; ++i) 
    printf("%d ", d[i]); 
    puts("\n"); 
} 

上記のスニペットは印刷になります。

0 1 2 3 4 
1 2 3 4 4 
1 2 1 2 3 
0

あなたは配列の要素をシフトしていませんでしたQ++をやっている場合は、お使いのアレイは、単に第二の要素(インデックス1を指しています)。したがって、Q [4]は配列に属していないものを読み込んでいます.Cはあなたにそれを許すのに十分許容されますが(ほとんどの場合)、間違いです。あなたはreallocをする必要がありますサイズ4の配列を持つように、

memmove(Q, Q+1, 4*sizeof(int)); 

が、実際に

for (int i=0; i<4; i++) 
    Q[i] = Q[i+1]; 

または(賢く)を行う必要がありますいずれかの要素をシフトする

BUTもしあなたがそれを行う必要があれば、多分配列はあなたが使うべきデータ構造ではないかもしれません。リンクされたリストがより良い選択肢と思われます。

関連する問題