1

こんにちは、私がCに触れてからしばらく経っているので、本当に錆びています。2 つの動的配列を使用して行列を作成する小さなプログラムを作成しました。しかし、この警告が表示されますが、その理由がわかりません。ポインターへのポインターについてはよくわかりません。誰かが私の問題がどこにあるかを指摘するのを手伝ってくれますか? ありがとう。

sm.c: In function ‘main’:
sm.c:11:13: warning: initialisation from incompatible pointer type [enabled by default]
sm.c: In function ‘makeMatrix’:
sm.c:27:3: warning: return from incompatible pointer type [enabled by default]


#include <stdio.h>
#include <stdlib.h>

typedef int (**intptr) (); 
intptr makeMatrix(int n); 

int main(int argc, char *argv[]) {

  int n = 2;  

  int **A = makeMatrix(n);
  if(A) { 
    printf("A\n");
  }
  else printf("ERROR");
}

intptr makeMatrix(int size) {
  int **a = malloc(sizeof *a * size);
  if (a) 
  {
    for (int i = 0; i < size; i++)
    {   
      a[i] = malloc(sizeof *a[i] * size);
    }   
  }
  return a;
}
4

2 に答える 2

3

ここにいくつかの問題があります:

typedef int (**intptr) (); 
intptr makeMatrix(int n); 

...

int **A = makeMatrix(n);

intptrtypedef は、不確定な数の引数を取り、 を返す関数へのポインターへのポインターを宣言しますintAではありませんint

あなたは書く必要があります:

int **makeMatrix(int n);


int **A = makeMatrix(n);

ここではa を使用してtypedefもあまり役に立ちません。

typedef int **(*intptr)();

へのポインターへのポインターを返す関数へのポインターを宣言しますint。しかし、書く

intptr makeMatrix(int n);

makeMatrix()ではなく、関数へのポインタを返すと宣言しますint **

于 2012-04-10T04:06:03.650 に答える
0

typedef には余分な があり()、引数がゼロの関数型になります。それを取り除けば、あなたは元気になるはずです。

于 2012-04-10T04:05:21.193 に答える