3

私は質問をしました:Cを使用して参照によって配列を渡します。私の問題はCでのポインター星の使用であることに気づきました。そして最終的に、この方法は私のプログラムでうまく機能することがわかりました。

#include <stdio.h>

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

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

int main()
{
     int* myArray = NULL;
     FillArray(& myArray);  
     printf("%d", myArray[0]);
     return 0;
}

その時点まではすべて問題ありませんでした。次に、コードを読みやすくするために、FillArray()関数を次のように変更しました。

#include <stdio.h>

void FillArray(int** myArray)
{
     int* temp = (*myArray);

     temp = (int*) malloc(sizeof(int) * 2);
     temp[0] = 1;
     temp[1] = 2;
}

int main()
{
     int* myArray = NULL;
     FillArray(& myArray);  
     printf("%d", myArray[0]);
     return 0;
}

ここで、printf行で次の実行時エラーが発生します。

Trial.exeの0x773115deで未処理の例外:0xC0000005:アクセス違反の読み取り場所0x00000000。

私はCの専門家ではありませんが、この変更を行うことは正当であるように思われました。しかし、どうやらそれは動作しません。構文は少し混乱していませんか?ここで何かが恋しいですか?

有益な回答をありがとう、

言う。

4

6 に答える 6

5

tempのアドレスのコピーを取得しますが、myArray次にmallocedメモリをtempに割り当てるため、元の割り当ては無意味であり、永続的な効果はありませんでした。次に、mallocedメモリを変更しますが、それはまったく変更myArrayされません。に変更myArrayするにはmain、を割り当てる必要があります

*myArray = temp;

の終わりにFillArray

void FillArray(int** myArray)
{
     int* temp;
     temp = (int*) malloc(sizeof(int) * 2);
     temp[0] = 1;
     temp[1] = 2;
     *myArray = temp;
}

あなたが意図したことをします。

于 2012-05-03T21:15:02.267 に答える
1

mallocされたバッファをスタック上のローカル変数だけに割り当て、戻ったときにそのメモリをリークします。関数に渡されるポインターに影響を与えることはありません。

于 2012-05-03T21:14:25.187 に答える
0
int* temp = (*myArray);

tempローカル変数です。変更を加えても、元のファイルには影響しません。

temp = (int*) malloc(sizeof(int) * 2);  // Will not affect *myArray

それは多かれ少なかれ-のようなものです

void foo( int * ptr )
{
   ptr = malloc( sizeof(int) );
}

int *a ;
foo(a);   // Does `a` get allocated too ? NO.
于 2012-05-03T21:16:15.353 に答える
0

これは私のために働きます:

#include <stdio.h>

void FillArray(int** myArray)
{
    (*myArray) = (int*) malloc(sizeof(int) * 2);
    (*myArray)[0] = 1;
    (*myArray)[1] = 2;
}

int main()
{
    int* myArray = NULL;
    FillArray(& myArray);  
    printf("%d\n", myArray[0]);
    printf("%d\n", myArray[1]);
    return 0;
}
于 2012-05-03T21:21:33.840 に答える
0
int* temp = (*myArray);

この行が問題の根本的な原因です。この行を見てみましょう。

参照解除とは、でmyArrayある結果値を割り当てます。isと、であるため、参照解除すると結果が。になります。ただし、myArrayを引数として渡した場合はNULLであり、(* myArray)を実行すると、myArrayが指すメモリ位置にアクセスしようとするため(どこにもありません)、どこも指していないポインタを逆参照することはできません。 myArrayがNULLであるため)したがって、アクセス違反の読み取り位置0x00000000は、NULLポインターを逆参照しようとしていることを意味します。tempint *myArrayint **int *

上記とは別に、コードが何をしているのかを見てみましょう。最初の画像は次のようになっています。

myArray ======> NULL

1行目以降

int* temp = (*myArray); //pointing temp to (*myArray)

myArrayはNULLであるため、一時的なポイントはありません。したがって、新しい画像はどこにもありません。

myArray =======> NULL
temp =======> NULL

2行目temp=(int *)malloc(sizeof(int)* 2);

2つの整数のメモリを割り当て、画像が次のようになるように、新しく割り当てられたメモリを一時的に指定します

myArray =======> NULL
temp =======> [ ] [ ]

次の2行は、tempが指す1番目と2番目のメモリ位置に1と2を格納します

 temp[0] = 1;
 temp[1] = 2;

だから今、写真は

myArray =======> NULL
temp =======> [1] [2]
于 2012-05-03T21:37:25.610 に答える
-2

割り当てる前にMalloctemp!

于 2012-05-03T21:12:44.120 に答える