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]
指向一个3int
的分配,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