2017-06-12 4 views
-4

Warum bekomme ich diese Warnung? Die Ausgabe war richtig, wie ich wollte.dies ist ein einfacher Zeiger Praxis.Aber ich bekomme die unerwünschte warning.please Hilfe.Warum bekomme ich "Warnung: Zuweisung von inkompatiblem Zeigertyp [standardmäßig aktiviert] |"

#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;' ist ein sofortiges undefiniertes Verhalten. Bitte verwenden Sie auch '[]', dafür sind sie da. – unwind

+1

'int * ptr [b]' deklariert ptr als ein Array [b] des Zeigers nach int. Dann versuchen Sie, 1 nach dem Ende des Arrays zu vergeben. Sie versuchen auch, einen Zeiger auf das Array von int (nach der Konvertierung) einem Zeiger auf int zuzuweisen. –

+0

Typ von 'ptr [b]' ist 'int *'. Typ des ausgewerteten 'arr' ist' int (*) [b] '. Diese zwei Arten sind unterschiedlich. – BLUEPIXY

Antwort

1

Da ein Array int [a][b] (2D int array) mit int* (int pointer) keinen kompatiblen Typ ist. Ein 2D-Array, wenn es in einem Ausdruck verwendet wird, zerfällt zu einem Zeiger auf das erste Element, das in diesem Fall ein Array-Zeiger auf ein 1D-Array vom Typ int(*)[b] wäre.

Die Zeile ptr[b]=arr; macht daher keinen Sinn und sie greifen auch auf das Array ptr außerhalb der Grenzen zu.

Wenn Sie einen Zeiger auf das erste Element in der 2D-Array haben wollen, würden Sie eingeben müssen

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

, werden Sie mir bitte mit diesem Code helfen.Ich bin dynamisch eine 2D-Array von Ihrem Konzept dieser Antwort zuweisen [link] (https://stackoverflow.com/questions/42094465/correctly-allocating-multi-dimensional-arrays? noredirect = 1 & lq = 1) .aber ich habe diese Deklaration nicht verstanden –

0

ja, ich habe es herausgefunden haben out.Now, ich meine Fehler zu verstehen.

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

total wrong.In hier I eine Reihe von „PTR“ die Zeiger einen Zeiger „arr“ auf „PTR [b]“, um Ganzzahl- und wurde Zuweisen wurde erklärt, die Zeiger auf integer.as ist, arr ist ein 2D-Array, das die Adresse von arr [0] [0] zurückgibt. aber ptr [b] ist ein Zeiger auf integer.so, diese sind nicht die gleichen. (Tatsächlich ist "ptr [b] = arr" doesn ' t jede sense.at machen erste, ich habe verstanden es nicht genug, aber jetzt habe ich es behoben.

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

jetzt funktioniert es ohne Vorwarnung.

-1

Ich habe den Code geändert, indem ich eine diagnostische printf-Anweisung hinzugefügt habe, die den Wert von * ptr [b] anzeigt, aber es gibt andere Warnungen. Warum habe ich "Warnung: Zuweisung aus inkompatiblem Zeigertyp [standardmäßig aktiviert] |" gelöst? Ich habe diesen Code in Geany IDE-Paket auf Linux Ubuntu 16.04 ausgeführt.

#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

aber jetzt wird ptr nicht die Basisadresse zeigen –

Verwandte Themen