Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Arrays_Pointers_Struct_Casting - Fatal编程技术网

C 为什么这个指针解引用的例子有效?

C 为什么这个指针解引用的例子有效?,c,arrays,pointers,struct,casting,C,Arrays,Pointers,Struct,Casting,我有一些代码,它是有效的,我不明白为什么。在这里: //此结构将数组及其簿记详细信息保存在一起。 类型定义结构{ 无效**阵头; 尺寸和编号; 大小\u t当前大小; }生长阵列; //此函数malloc()是一个空数组,并返回一个包含该数组及其簿记详细信息的结构。 GrowingArray创建GrowingArray(int startingSize){…} //不言自明 void appendToGrowingArray(GrowingArray*GrowingArray,void*item

我有一些代码,它是有效的,我不明白为什么。在这里:

//此结构将数组及其簿记详细信息保存在一起。
类型定义结构{
无效**阵头;
尺寸和编号;
大小\u t当前大小;
}生长阵列;
//此函数malloc()是一个空数组,并返回一个包含该数组及其簿记详细信息的结构。
GrowingArray创建GrowingArray(int startingSize){…}
//不言自明
void appendToGrowingArray(GrowingArray*GrowingArray,void*itemToAppend){…}
//此函数realloc()是一个数组,使其大小加倍。
无效增长阵列(增长阵列*阵列增长){…}
int main(int argc,char*argv[]){
生长阵列测试阵列=创建生长阵列(5);
int*testInteger=(int*)malloc(1);
*testInteger=4;
int*另一个整数=(int*)malloc(1);
*另一个整数=6;
附件RowingArray(&testArray,&testInteger);
附件RowingArray(&testArray,&anotherInteger);
printf(“%llx\n”,**(int**)(testArray.headOfArray[1]);
返回0;
}
到目前为止,一切都完全按照我的意愿进行。让我困惑的是这句话:

printf(“%llx\n”,**(int**)(testArray.headOfArray[1]);
根据我的理解,printf()的第二个参数没有意义。我主要是通过反复试验来达到目的的。对我来说,好像我在说结构中指针数组的第二个元素是指向int的指针,而不是。它只是一个指向int的指针

对我来说有意义的是:

*(int*)(testArray.headOfArray[1])
我的理解是,结构中包含的指针数组的第二个元素将由最后一个括号获取,然后我将其转换为指向整数的指针,然后取消对该指针的引用


我的理解有什么问题?编译器是如何解释这一点的?

我最好的猜测是,您的
附件rowingarray
如下所示:

void appendToGrowingArray(GrowingArray* growingArray, void* itemToAppend) {
    growingArray->headOfArray[growingArray->numberUsed++] = itemToAppend;
}
虽然显然有额外的逻辑来实际增长箭头。但是,关键是要显示的
项存储在
headOfArray
指向的数组中

但是,如果查看
appendToGrowingArray
调用,您正在传递
testInteger
另一个integer
地址,它们已经是指向整数的指针,因此,当您真正打算存储指向整数的指针时,您正在
headOfArray
中存储指向整数的指针

这样,当您考虑<代码> TESTARRAI.Head OFFREST(1)< /代码>时,它的值是变量<代码>主代码< /代码>的堆栈中的变量<代码>另一个整数< /代码>。当您第一次取消引用它时,它现在指向存储在

另一个Integer
中的第二个
malloc
调用返回的缓冲区地址。所以,只有当你第二次遵从它时,你才能得到缓冲区的内容,即数字6

你可能想写:

appendToGrowingArray(&testArray, testInteger);
appendToGrowingArray(&testArray, anotherInteger);
相反


(如评论中所述,您还应该修复malloc;现在需要超过1个字节来存储整数!)

我的最佳猜测是,您的
附件rowingarray
如下所示:

void appendToGrowingArray(GrowingArray* growingArray, void* itemToAppend) {
    growingArray->headOfArray[growingArray->numberUsed++] = itemToAppend;
}
虽然显然有额外的逻辑来实际增长箭头。但是,关键是要显示的
项存储在
headOfArray
指向的数组中

但是,如果查看
appendToGrowingArray
调用,您正在传递
testInteger
另一个integer
地址,它们已经是指向整数的指针,因此,当您真正打算存储指向整数的指针时,您正在
headOfArray
中存储指向整数的指针

这样,当您考虑<代码> TESTARRAI.Head OFFREST(1)< /代码>时,它的值是变量<代码>主代码< /代码>的堆栈中的变量<代码>另一个整数< /代码>。当您第一次取消引用它时,它现在指向存储在

另一个Integer
中的第二个
malloc
调用返回的缓冲区地址。所以,只有当你第二次遵从它时,你才能得到缓冲区的内容,即数字6

你可能想写:

appendToGrowingArray(&testArray, testInteger);
appendToGrowingArray(&testArray, anotherInteger);
相反


(如评论中所述,您还应该修复malloc;现在需要超过1个字节来存储整数!)

您的设计是错误的<代码>阵列头
应为
void*
。您还应该调用
appendToGrowingArray(&testArray,testInteger)
附件行阵列(&testArray,&testInteger)
*testInteger=4写入超出范围,您只分配了1个字节
**(int**)(testArray.headOfArray[1])
可能是未定义的行为,并且您使用了错误的printf格式说明符。为了在发布MCVE时获得更好的答案,在你没有发布的代码中有很多未知因素会影响问题,为什么你认为它是指向int的指针??您向数组中添加了
&另一个Integer
anotherInteger
是指向整数的指针,因此
&anotherInteger
是指向整数的指针。您的设计是错误的<代码>阵列头
应为
void*
。您还应该调用
appendToGrowingArray(&testArray,testInteger)
附件行阵列(&testArray,&testInteger)
*testInteger=4写入超出范围,您只分配了1个字节
**(int**)(testArray.headOfArray[1])
可能是未定义的行为,并且您使用了错误的printf格式说明符。为了在发布MCVE时获得更好的答案,在你没有发布的代码中有很多未知因素会影响问题,为什么你认为它是指向int的指针??您向数组中添加了
&另一个Integer
<代码>另一个连接器