【问题标题】:Why ArrayPointer gives segmentation default?为什么 ArrayPointer 给出分段默认值?
【发布时间】:2021-02-01 01:17:45
【问题描述】:

在我的代码中,当我将 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));

}

【问题讨论】:

标签: arrays c pointers multidimensional-array segmentation-fault


【解决方案1】:

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

#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));
}

【讨论】:

    【解决方案2】:

    这里有一点关于为什么

    #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
    

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

    【讨论】:

    • 感谢您的回复,但是这里发生了什么? 0x200000001 是什么?我也试过void* myPtr = *(ptrptr + 0); printf ( "Indirect: %p Direct: %p\n", (void*) &amp;myPtr, (void*)&amp;*(ptrptr + 0));,但是为什么间接和直接地址不同?
    • 谢谢。现在我得到了他们两个0x200000001。但是我仍然不知道0x200000001来自哪里以及它的含义是什么。请您再解释一下好吗?
    猜你喜欢
    • 2021-04-29
    • 2015-05-11
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多