2017-06-12 85 views
-4

爲什麼我得到這個警告?輸出是正確的,因爲我想。這是一個簡單的指針practice.But我得到不需要的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]'。這兩種類型是不同的。 – BLUEPIXY

回答

1

因爲數組int [a][b](2D int數組)不兼容的類型與int*(INT指針)。在表達式中使用時,二維數組衰減爲指向第一個元素的指針,在這種情況下,該數組將指向一維數組的指針,類型爲int(*)[b]

因此行ptr[b]=arr;沒有意義,它也訪問數組ptr越界。

如果你想有一個指向二維數組中的第一項,你必須鍵入

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

,請你幫我用這個code.I動態分配一個二維數組,你的這個答案的概念[鏈接](https://stackoverflow.com/questions/42094465/correctly-allocating-multi-dimensional-arrays? noredirect = 1&lq = 1)。但我不明白這個聲明 –

0

是的,我想它out.Now,我明白我的錯誤。

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

完全這裏wrong.In我聲明「PTR」,其是指向整數的數組,並分配一個指針「ARR」到「PTR並[b]」,其是指向integer.as, arr是一個二維數組,它返回arr [0] [0]的地址。但是 ptr [b]是指向integer.so的指針,它們不一樣(實際上,「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不會指向基地址 –

相關問題