3

はい、私はこの質問と回答を読みました: Passing an array by reference in C? . 私は同様の問題を抱えており、その質問から同じアイデアを実装しました。

ただし、次のコードからまだエラーが発生します。

#include <iostream>

void FillArray(int** myArray)
{
   free( *myArray ) ;
   * myArray = (int*) malloc(sizeof(int) * 2);

   *myArray[0] = 1;
   *myArray[1] = 2;
}

int main()
{
   int* myArray = NULL;
   FillArray(& myArray);    
   return 0;
}

FillArray 関数が終了した直後に、次の実行時エラーが発生しました。

Program.exe 0xC00000005 の 0x773115de で未処理の例外: アクセス違反書き込み場所 0xcccccccccc。

私は Visual Studio を使用しており、Visual C++ の空のプロジェクトを開きました。そして、main.cpp という名前のファイル。CコンパイラではなくC++コンパイラでコンパイルされているということですか?その場合、C コンパイラのみでコンパイルされるファイルを開くにはどうすればよいですか? main.cpp の名前を main.c に変更しようとしましたが、それでも同じ問題が発生します。(「参照渡し」についていくつか読んで、CとC ++で異なることがわかったので、この質問をしています。)

この非常に基本的な質問で申し訳ありません。

私はどんな助けにも感謝します、

言った。

4

3 に答える 3

10

優先順位は、期待どおりに機能していません。これらを試してください:

(*myArray)[0] = 1;
(*myArray)[1] = 2;

(注:iostreamCではありません。C++です。)

于 2012-05-03T20:15:13.810 に答える
2

あなたの問題は、演算子の優先順位の 1 つです。

オペレーターは[]オペレーターよりも強く結合する*ので、

*myArray[1] 

と同じです

*(myArray[1]).  

最上位のポインターには 1 つのポインターに十分なメモリしか割り当てられていないため、これは誤りです。あなたがしたい:

(*myArray)[1] = 2;

余談ですが、あなたのように C と C++ を混在させる正当な理由はありません。明らかに、ここには C++ コードがあるので、後者の 2 つは複雑なオブジェクトのコンストラクターとデストラクタを考慮していないため、優先して newくださいdeletemallocfree

于 2012-05-03T20:13:30.747 に答える
1

良い:

int main()
{
   int* myArray = NULL;
   FillArray(& myArray);   
   ...

良い:

void FillArray(int** myArray)
{
   * myArray = (int*) malloc(sizeof(int) * 2);

壊滅的に悪い:

void FillArray(int** myArray)
{
   free( *myArray ) ;
   * myArray = (int*) malloc(sizeof(int) * 2);
   ...

より良い:

void FillArray (int** myArray)
{
   if (myArray)
     free (*myArray);
   *myArray = (int*) malloc(sizeof(int) * 2);
   ...

また:

   *(myArray[0]) = 1;
   *(myArray[1]) = 2;
于 2012-05-03T20:13:47.130 に答える