我希望有人能用这段代码帮助我。这是一个愚蠢的测试,但我不知道我做错了什么。就像这样:
#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。
答案 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);