清单:
struct list{
int Id;
short Value;
struct list *next;
};
所以我想通过使用节点的地址来找出列表的大小(不使用sizeof)。每个节点彼此相差24个字节。这是我为此目的编写的代码:
struct list *tmp;
int sum=0;
for(tmp=ptr; tmp!=NULL; tmp=tmp->next){
sum = sum + tmp->next - tmp;
}
printf("\nThe size of the list in bytes is:%d", sum);
tmp 是指向列表的指针。 ptr 是指向头部的列表的指针。我使用tmp是因为我需要在我的代码上使用ptr。当我执行上面的操作时,我得到这个:列表的大小以字节为单位:143132 .... 。这个数字每次都不同,但它不是我想要的。
答案 0 :(得分:3)
所以我想通过使用节点的地址来找出列表的大小(不使用sizeof)。
你不能这样做。无法保证列表中的相邻节点线性布局/内存中没有间隙。
每次他的号码都不同
因为每次运行都可能在不同的地址分配内存。
每个节点彼此不同24个字节
即使为每个节点相邻地分配了内存,也可能存在打包问题。在普通的真实计算机上不可能发生24字节的大小(因为该数字可以被4和8整除)。但是,如果您的尺寸是23,分配的空间将在许多架构上进行四舍五入。
除非你维护某种单独的计数器或索引,否则知道链表大小的唯一方法就是从头开始遍历它。
答案 1 :(得分:0)
正如埃里克的补充一样,我会说:
sizeof(list)
以了解每个节点占用的字节数。我说“确定”,因为sizeof(list)
的结果取决于架构,尤其是内存对齐和字大小。现在,如果出于任何原因禁止使用sizeof(list)
,那么您可以通过以下方式进行计算:
size_t my_sizeof_of_list()
{
struct list * zero = 0;
return (size_t) &zero[1];
}
此代码可以适用于list
以外的其他类型,并包含泛型类型。
n*sizeof(list)
(或n*my_sizeof_of_list()
)。否则,就像Eric指出的那样,您需要遍历列表以计算节点。之后,总数为n*sizeof(list)
。在最后一种情况下,最好更简单,更快速,只需计算并计算总大小而不是累积它。答案 2 :(得分:0)
找出列表的大小(不使用sizeof)
sizelist = (char *)(((struct list *)0)+1)-(char *)(((struct list *)0));
或
#define sizelist ((char *)(((struct list *)0)+1)-(char *)(((struct list *)0)))