3

関数に渡された配列の要素にアクセスする際に問題が発生しています。

#define N (128)
#define ELEMENTS(10)
typedef int (*arrayOfNPointers)[N];

したがって、これが正しければ、 へのNポインターの配列を記述するデータ型intです。

次のように、後で配列を個別に初期化します。

arrayOfNPointers myPtrs = { 0 };
int i;
for (i=0; i<N; i++) {
  myPtrs[i] = (int*)malloc(ELEMENTS);
}

ただし、これは次のエラーで失敗します。

error: incompatible types when assigning to type 'int[128]' from type 'int *'

だから、私の構文に何か非常に間違っているようです。しかし、そのような構造の内容を変更している別のコードのチャンクでは、問題はありません。

void doWork(void* input, void* output) {
   int i,m,n;
   arrayOfNPointers* inputData = (arrayOfNPointers*)input;
   int* outputData = (int*)output;

   for (m=0, n=0; n<nSamples; n++) {
      for (i=0; i<nGroups; i++) {
         outputData[m++] = (*inputData)[i][n];
      }
   }
}

この配列ロジックは深刻に壊れていますか?

4

3 に答える 3

4

あなたが探しているのは次のとおりだと思います...

#define N 128
#define ELEMENTS 10
typedef int* arrayOfNPointers[N];

arrayOfNPointers myPtrs = { 0 };
int i;
for (i=0; i<N; i++) {
  myPtrs[i] = malloc(sizeof( int ) * ELEMENTS);
}

arrayOfPointer を ELEMENTS 整数への N 個のポインターの配列にする必要があります。また、整数のスペースを malloc() するときは、ELEMENTS の数に整数のサイズを掛ける必要があります。現状では、割り当てているスペースが小さすぎて、保存しようとしているデータを保持できません。

typedef は、arrayOfPointer を N 個の整数の配列へのポインターとして宣言しました。変数/型を宣言しているものを理解するために、左右の読み取り規則を使用することを忘れないでください。括弧内にあるため(*arrayOfPointer)、右側には何もなく、左側にはポインターがあったため、arrayOfPointer は TO [N](右) int (左) へのポインターです。あなたが意図したものではありません。

また... C で malloc() をキャストしないでください!

于 2013-04-23T21:13:03.833 に答える