2012-02-14 11 views
0

私はCクラスの課題をここ数日間作業していましたが、Cのrealloc()関数に関する不思議なクラッシュを経験しました。 C++のプログラマーは、自分のコードで何が間違っているのかすぐに私に答えられませんでした。realloc()を何度か呼び出すとCプログラムがクラッシュする

まず私は1つの関数でメモリ・ブロックを作成します。

char *line = (char *)malloc(sizeof(char) * BUFSIZE); 

その後、私は私がにBUFSIZEを設定する内容に応じて、それが第五コール(BUFSIZE =の後にクラッシュするgetMoreBuf(start_of_block, end_of_block)

int getMoreBuf(char *start, char *end) 
{ 
char *newBuf = 0; 
int newSize = (end - start) + BUFSIZE; 
    newBuf = (char *)realloc(start, sizeof(char) * newSize); 
    if(NULL == newBuf) { 
     printf("No virtual RAM available"); 
    }else{ 
     start = newBuf; 
    } 
    return newSize; 
} 

を呼び出します1)または3番目の呼び出し(BUFSIZE = 5)を返し、読み込まれた文字をナンセンスに置き換えます。

誰かが私のエラーに向かって私を指摘し、それらを修正するためにどこを読むべきかを示唆することができますか? 何か助けていただければ幸いです。 :)

賞与質問:私は、メモリブロック内の1つのブロックに向かって、ポインタ1が最初のポインタ、後のポインタ2のポイント2を持つメモリブロックをmallocします。私はrealloc()ブロックとサイズの問題のためにブロックが移動され、ポインタ2はまだ古い(今は役に立たない)ブロックを指していますか、それはメモリブロックの新しい位置にreallocで "移動"ですか?

(また、将来のために、私は新しい問題には、余分な質問を置くべきか、それが強く最初の質問に関連しているので、私はここでそれを残すことができますか?)

をご入力ありがとうございました、何がうまくいかなかったかを理解するのに大いに役立ちました。 もし私が正しい答えとしてそれぞれを記入することができれば、それぞれが何らかの形で私の助けを借りて、この気の利いたポインタビジネスについてもう少し理解することができたからです。 =)

+0

[*でもプログラマー*](http://c-faq.com/ptrs/passptrinit。html)Cプログラマを試してみたはずですか? – cnicutar

+0

はい、私はCとC++のプログラマーを試しましたが、私はそれを言い忘れました。私はそれを修正し、私はリンクを調べます。 – Plastefuchs

答えて

2

私はあなたの問題は、あなただけのローカル変数startを変更しているということだと思います...ポインタを使う必要があります。

int getMoreBuf(char **start, char **end) 
{ 
    char *newBuf = 0; 
    int newSize = (*end - *start) + BUFSIZE; 
    newBuf = (char *)realloc(*start, sizeof(char) * newSize); 
    if(NULL == newBuf) { 
     printf("No virtual RAM available"); 
    } else { 
     *start = newBuf; 
     *end = *start + newSize; 
    } 
    return newSize; 
} 

そして、あなたはそれが好きで呼びたい:

getMoreBuf(&start_of_block, &end_of_block) 
+2

'end'もおそらく再計算される必要があることに注意してください。そうでなければ' newSize'の計算は間違った値を返します... –

+0

@Martin:あなたは絶対に正しいです。 – cha0site

+0

あなたの答えをありがとう!私は自分自身でそれを理解するための入力のビットを期待していたが、これも動作します。次回はこのことを覚えておいてほしい。 :) – Plastefuchs

3

これ:

start = newBuf; 

startを変更しています。しかし、startはローカル変数です。呼び出し側が持つ変数には影響しません。

これを解決するには、startをポインターポインターとして使用するか、newBufを返す必要があります。

+0

@Plastefuchs:いいえ、それはできません。ポインタ自体を変更する必要があるので、ポインタ、つまりポインタへのポインタを渡す必要があります。 –

+0

あなたの答えをありがとう、それは私がすでにポインタと関数について知っていたと思ったいくつかのことを考えるのを助けました。 – Plastefuchs

2

問題はstartの新しい値がgetMoreBuf()機能の外に渡されていないことである - あなたの関数のプロトタイプは次のようになりする必要があるだろう。すなわち、あなたが、これを行うには、ダブルポインタが必要になります。

int getMoreBuf(char **start, char **end); 

(私はあなたがおそらくあまりにも、それのための新しい値を計算する必要がありますので、あまりにもendダブルポインタを作りました。)

+0

すぐにお返事ありがとうございます! – Plastefuchs

関連する問題