メモリの動的割り当てをするには?

解決


POP  2002-09-23 14:59:30  No: 50403  IP: [192.*.*.*]

質問です。
電話帳のプログラムを作りたいのですが、データが追加される毎にメモリを割り当てるにはどうすれば良いのですか?
ポインタを使って、ポインタ++のたびにメモリを割り当てたいです。
色々調べたのですが、calloc()を使うとデータが消えてしまいます。
教えてください。

編集 削除
a  2002-09-23 20:11:39  No: 50404  IP: [192.*.*.*]

realloc()使ってみては?

編集 削除
YuO  2002-09-24 00:37:40  No: 50405  IP: [192.*.*.*]

std::vectorを使えば何も考えずに突っ込めます。
#C++ですが。

編集 削除
POP  2002-09-24 12:06:46  No: 50406  IP: [192.*.*.*]

すみません。C言語です。
realloc()を使う場合、例えば
    int *p;

    p=(int*)calloc(1,sizeof(int));
    ++p=(int*)realloc(p++,sizeof(int));
で良いのですか?

編集 削除
YuO  2002-09-24 12:33:02  No: 50407  IP: [192.*.*.*]

ポインタの「反復子(iterator)としての機能」と
「オブジェクトの別名(alias)としての機能」がごっちゃになっていますね。

int * base = 0; /* これはaliasとして利用 */
int count;

for (count = 0; count < 5; ++ count) {
    int sum = 0;
    int * ptr; /* こっちはiteratorとして利用 */
    base = realloc(base, sizeof(int) * (count + 1));

    for (ptr = base; ptr != base + count; ++ptr) {
        sum += *ptr;
    }
    *ptr = sum + 1;
}
free(base);

aliasに利用するポインタに対して加算等の演算を行ってはいけません。
malloc/calloc/reallocで得たポインタは,常にaliasの為にのみ使います。
iteratorの機能が必要であれば,そのポインタをコピーして用意する必要があります。

編集 削除
ともみ  2002-09-25 17:07:50  No: 50408  IP: [192.*.*.*]

成功しました。
ありがとうございました。

編集 削除