2017-06-12 9 views
-4

なぜ私はこの警告を受けていますか?出力は私が望んだ通りです。これは簡単なポインタの練習です。しかし、私は望ましくないwarning.pleaseの助けを得ています。なぜ私は "警告:互換性のないポインタ型からの割り当て[デフォルトで有効] |"

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
#include<time.h> 
main() 
{ 
int a,b,c,i,j,k=0; 
scanf("%d%d", &a, &b); 
int arr[a][b]; 
int *ptr[b]; 
ptr[b]=arr; 
for(i=0;i<a;i++) 
{ 
    for(j=0;j<b;j++) 
    { 
     *(*(arr+i)+j)=k; 
     k++; 
    } 
} 
for(i=0;i<a;i++) 
{ 
    for(j=0;j<b;j++) 
    { 
     printf("%d\t",*(*(arr+i)+j)); 
    } 
    printf("\n"); 
} 
return 0; 

} 
+3

'ptr [b] = arr;'は即座に未定義の動作です。また、 '[]'を使ってください – unwind

+1

'int * ptr [b]' ptrをintへのポインタの配列[b]として宣言します。次に、配列の最後を1回越えて割り当てます。 intの配列へのポインタ(変換後)をintへのポインタに代入しようとしています。 –

+0

'ptr [b]'の型は 'int *'です。評価される 'arr'の型は' int(*)[b] 'です。これら2つのタイプは異なります。 – BLUEPIXY

答えて

1

アレイint [a][b](2次元int配列)がint*(INTポインタ)と互換性のある型ではないので。式で使用される2D配列は、最初の要素へのポインタに減衰します。この場合、1次元配列への配列ポインタは、int(*)[b]です。

したがって、ptr[b]=arr;行は意味をなさないし、範囲外の配列ptrにもアクセスします。あなたは2次元配列の最初の項目へのポインタを持っているしたい場合

、あなたは

ptr[n] = &arr[0][0]; // where n is a value that makes sense 
+0

、あなたはこのコードで私を助けてくださいますか?私は動的にこの答え[リンク](https://stackoverflow.com/questions/42094465/correctly-allocating-multi-dimensional-arrays? noredirect = 1&lq = 1)。しかし、私はこの宣言を理解できませんでした。 –

0

を入力する必要がありますはい、私は私が私のミスを理解し、それをout.Now考え出してきました。

int* ptr[b]; 
ptr[b]=arr; 

は全く、Iは整数へのポインタである「PTR」の配列を宣言し、integer.asへのポインタである「PTR [B]」にポインタ「ARR」を代入し、ここwrong.Inれますarr [0] [0] .butのアドレスを返す2次元配列です。 ptr [b]は整数へのポインタです。これらは同じではありません(実際には "ptr [b] = arr" doesn 'トン任意のsense.at最初、私は十分にそれを理解していなかったが、今、私はそれを修正しました。

int (*ptr)[b]; 
ptr=arr; 

は、今では何の警告もなく動作します。

-1

* ptr [b]の値を表示する診断printf文を追加してコードを変更しましたが、その他の警告があります。私はなぜ警告を得るのですか:互換性のないポインタ型[デフォルトで有効]からの割り当て| "が解決されました。私はlinux Ubuntu 16.04のgeany IDEパッケージでこのコードを実行しました。

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
#include<time.h> 
int main() 
{ 
    int a,b,c,i,j,k=0; 
    scanf("%d%d", &a, &b); 
    int *arr[a][b]; 
    int *ptr[b]; 
    ptr[b]=arr[a][b]; 
    printf("\n%s%d","pointer = ",ptr[b]); 
    for(i=0;i<a;i++) 
    { 
     for(j=0;j<b;j++) 
     { 
      *(*(arr+i)+j)=k; 
      k++; 
     } 
    } 
    for(i=0;i<a;i++) 
    { 
     for(j=0;j<b;j++) 
     { 
      printf("%d\t",*(*(arr+i)+j)); 
     } 
    printf("\n"); 
    } 
    return 0; 
} 
+0

今、ptrはベースアドレスを指しません –

関連する問題