为什么ArrayPointer赋予细分默认设置?

问题描述

在我的代码中,当我将void myFunc(int arrayInput[3][2])更改为void myFunc(int **arrayInput)时,第5行出现了分段错误,为什么?如何使用数组指针代替固定尺寸的数组?谢谢!

#include <stdio.h>

const int myArray[3][2] = {{1,2},{3,4},{5,6}};

int main2() {
  myFunc(myArray);
  return 0;
}

void myFunc(int arrayInput[3][2]) {

  printf("Line 1: %x\n",arrayInput);
  printf("Line 2: %x\n",arrayInput + 1);
  printf("Line 3: %x\n",*arrayInput);
  printf("Line 4: %x\n",*(arrayInput+1));
  printf("Line 5: %d\n",*(*(arrayInput + 1) + 0));

}

解决方法

双指针不代表2D数组。 您可以尝试做的是像这样动态分配二维数组

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

void myFunc(int** array);
int main() {
    int** myarray = malloc(3*sizeof(int*));
    for(int x = 0; x < 3;++x){
        myarray[x] = malloc(2*sizeof(int));
    }
    for(int col = 0; col < 3; ++ col){
        for(int row = 0; row < 2; ++row){
            myarray[col][row] = col+row;
        }
    }
    myFunc(myarray);
    
    
    for(int x = 0; x < 3;++x){
        free(myarray[x]);
    }
    free(myarray);
  return 0;
}

void myFunc(int** arrayInput) {

  printf("Line 1: %p\n",arrayInput);
  printf("Line 2: %p\n",arrayInput + 1);
  printf("Line 3: %p\n",*arrayInput);
  printf("Line 4: %p\n",*(arrayInput+1));
  printf("Line 5: %d\n",*(*(arrayInput + 1) + 0));
}
,

关于为什么

#include <stdio.h>

int myArray[3][2] = { { 1,2},{ 3,4},{ 5,6}};

void myFunc ( int array[3][2],int **ptrptr) {
    printf ( "   : %p   **: %p\n",(void*)array,(void*)ptrptr);
    printf ( "[0]: %p   **: %p\n",(void*)*(array + 0),(void*)*(ptrptr + 0));
    printf ( "[1]: %p   **: %p\n",(void*)*(array + 1),(void*)*(ptrptr + 1));
    printf ( "[1][0]: %d\n",*(*(array + 1) + 0));
}

int main ( void) {
    printf ( "myArray: %p\n",(void*)&myArray);
    myFunc ( myArray,myArray);
    return 0;
}

该程序将myArray作为数组和指针指针传递。
编译器警告我,指向指针的指针是不兼容的类型。

输出:

myArray: 0x55d518e9e010
   : 0x55d518e9e010   **: 0x55d518e9e010
[0]: 0x55d518e9e010   **: 0x200000001
[1]: 0x55d518e9e018   **: 0x400000003
[1][0]: 3

第一行给出myArraymain的地址。
第二行显示在myFunc中,两个指针都指向myArray
下一行显示了为什么类型不兼容。 *(array + 0)指向有效地址。 *(ptrptr + 0)指向无效的地址。它显示myArray[0]的两个整数作为小端系统上的地址,而不是另一个指针中的地址。
最后一行显示array的已取消引用地址处的值。尝试取消引用ptrptr中的无效地址会导致灾难。