Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 双指针-获取意外输出_C_Pointers_Double Pointer - Fatal编程技术网

C 双指针-获取意外输出

C 双指针-获取意外输出,c,pointers,double-pointer,C,Pointers,Double Pointer,根据我的说法,我应该得到: 3 4 2 5 3 5 6 3 原因: *(*b+4)=*(b[0]+4)b[0]+4指向b[1][1],因此该值应为4,即1,1位置的矩阵值 *(b[2]-2),现在b[2]-2指向b[1][1],所以值应该再次为4 请告诉我为什么我得到不同的输出当你声明一个像a[3][3]这样的二维数组时,整个数组是连续的,所以a[0][2]后面紧跟着a[1][0]。当您在a上使用指针算法时,只要您保持在整个a数组中,就可以依靠此能力跨行 但是,当使用指针数组时,没有理由期望每

根据我的说法,我应该得到:

3 4 2 5
3 5 6 3
原因:

*(*b+4)=*(b[0]+4)
b[0]+4
指向
b[1][1]
,因此该值应为
4
,即
1,1
位置的矩阵值

*(b[2]-2)
,现在
b[2]-2
指向
b[1][1]
,所以值应该再次为
4


请告诉我为什么我得到不同的输出

当你声明一个像
a[3][3]
这样的二维数组时,整个数组是连续的,所以
a[0][2]
后面紧跟着
a[1][0]
。当您在
a
上使用指针算法时,只要您保持在整个
a
数组中,就可以依靠此能力跨行

但是,当使用指针数组时,没有理由期望每一行都与前一行相邻。每次调用
malloc()
所分配的内存与以前的调用无关。另外,
malloc()
必须确保内存针对任何数据类型正确对齐;如果您分配的大小不是这个的倍数,则它们不可能是连续的。许多动态内存分配器在分配之前存储簿记信息(例如分配的大小,以便
free()
知道要回收多少内存),这样也可以防止分配是连续的


访问分配大小之外的内存是未定义的行为。既然
b[0]
指向一个3
int
的分配,
b[0]+4
在这个分配之外,
*(b[0]+4)
会导致未定义的行为。

为什么你认为
b[0]+4
指向
b[1][1]
?您分别分配了每一行,它们不是连续的。
a
的所有行都是连续的,因为它是一个二维数组。请尝试打印
b[0]
b[1]
的值,以查看它们的差异是否超过
3
@Barmar I read calloc分配连续内存?对
calloc()的每次调用
分配连续内存,但与其他调用不连续。
3 4 2 5
3 5 6 3
3 4 4 5
3 5 4 3