C - 指向数组的分段错误

时间:2016-11-10 14:11:16

标签: c

我希望有人能用这段代码帮助我。这是一个愚蠢的测试,但我不知道我做错了什么。就像这样:

#include <stdio.h>

int **ipp;

int ventas [3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};

int main(void){

    ipp = (int **)ventas;

    printf("%d\n", **ipp);

    return 0;
}

它编译(我正在使用GCC),但是当我执行它时,我不断遇到分段错误。我究竟做错了什么?我认为它与非初始化指针有关,但'ventas'是一个数组,因此它已经初始化,并且被分配给** ipp。

3 个答案:

答案 0 :(得分:1)

指向指针和2D数组的指针不可互换,请更改为:

int (*ipp)[4]; /* A pointer to an array of 4 ints */
...
ipp = ventas;

答案 1 :(得分:1)

  • 指向指针的指针不是数组。它也不是指向2D数组的指针。他们没有丝毫兼容。在这种情况下,只要忘记指针指针。

  • 如果您想要指向2D数组的指针,则必须编写int (*ipp)[3][4] = &ventas;

  • 您无法使用%d格式说明符打印指针。您应该使用%p

更正了打印2D阵列地址的代码:

#include <stdio.h>

int main(void){
  int ventas [3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
  int (*ipp)[3][4];

  ipp = &ventas;
  printf("%p\n", ipp);

  return 0;
}

答案 2 :(得分:1)

当你有像

这样的演员
ipp = (int **)ventas;

然后变量的值是数组ventas的第一个元素的地址。在这种情况下解除引用指针

*ipp

您获得存储在此地址的值。如果假设sizeof( int )等于sizeof( int * ),则等于1的数组的第一个元素被视为存储器地址。应用第二次解除引用后

**ipp

你的内存访问违规。

是正确的
int ( *ipp )[4] = ventas;

然后

printf("%d\n", **ipp);

或喜欢

int *ipp = ( int * )ventas;

然后

printf("%d\n", *ipp);