我正在尝试查找我定义的“标题”结构数组的长度(标题只包含一些信息性int成员,如果这与此相关)。我通过传递fl
(指向数组开头的指针)和idx
来尝试这一点,fl_tails
是一个索引值,指示在结尾处驻留的正确int arr_size(header* fl, int idx){
int cnt = 1; /* Anything passed guaranteed to have at least 1 */
while(fl != fl_tails[idx]){
fl++;
cnt++;
}
}
指针的位置。数组(在其他/重复的单词中,'fl_tails [idx]`是指向结尾的指针):
fl
我认为这只会推进header
指针并正确生成计数直到达到结束,但它会进入无限循环。我想知道这是由这个函数中的某些东西引起的还是我需要找到的其他东西引起的。当我将开头和结尾的地址打印为无符号整数时,它们看起来似乎无害 - 分别是16777216和16777344。我对{{1}}结构的理解及其对步骤的大小/影响可能也有问题吗?
答案 0 :(得分:1)
您想要比较地址,所以:
while(fl != &fl_tails[idx])
^
答案 1 :(得分:1)
我正在查看你的while循环,你将内存地址与索引的值进行比较。这总是评估为真。我相信这就是你获得无限循环的原因。
关于数组的长度,您是否考虑过使用sizeof()运算符/函数。
答案 2 :(得分:0)
问题是fl_tails[idx]
返回不同的指针类型,而fl
是不同的指针类型。他们永远不会指向同一个位置(除非他们在一个联盟中),所以,我认为,程序会进入无限循环。
答案 3 :(得分:0)
请记住:
while(fl != fl_tails[idx])
相当于:
while(fl != *(fl_tails + idx))
所以你要做的是将指针fl与实际值进行比较,因为(fl_tails + idx)是一个指针而*(fl_tails + idx)正在取消引用此指针以获取它指向的值。
所以如果你只是比较指针地址以找到数组的结尾,我会改为:
while(fl != &fl_tails[idx])
这样你就可以将指针与指针进行比较。
就你所获得的值而言,请记住,没有指针的指针可以有一个指针,它包含一个初始值(来自某个旧程序的旧值)。我建议看这个视频: