2012-04-10 44 views
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; 
} 
+1

'intptr'の' typedef'で ''()は何ですか? –

+0

[スタックオーバーフローは構文チェッカーではありません](http://meta.stackexchange.com/a/128596/172496) –

+2

彼にとっては幸運なことに、これは構文上問題ありません。 –

答えて

3

あなたがここにいくつかの問題を持っている:

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

... 

int **A = makeMatrix(n); 

intptr typedefが、引数の不確定数をとり、intを返す関数へのポインタへのポインタを宣言します。 Aintではありません。

あなたは記述する必要があります。typedefを使用して

int **makeMatrix(int n); 


int **A = makeMatrix(n); 

はずっとここに助けにはなりません。 intへのポインタへのポインタを返す関数へのポインタを宣言し

typedef int **(*intptr)(); 

。しかし

intptr makeMatrix(int n); 

を書くことmakeMatrix()は機能、ないint **へのポインタを返すことを宣言します。

0

あなたのtypedefは、ゼロ引数の関数型作り、余分な()を持っています。それを取り除くと、あなたはすばらしくなるはずです。

関連する問題