使用节点地址的链表大小

时间:2015-10-23 22:31:12

标签: c pointers linked-list

清单:

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 .... 。这个数字每次都不同,但它不是我想要的。

3 个答案:

答案 0 :(得分:3)

  

所以我想通过使用节点的地址来找出列表的大小(不使用sizeof)。

你不能这样做。无法保证列表中的相邻节点线性布局/内存中没有间隙。

  

每次他的号码都不同

因为每次运行都可能在不同的地址分配内存。

  

每个节点彼此不同24个字节

即使为每个节点相邻地分配了内存,也可能存在打包问题。在普通的真实计算机上不可能发生24字节的大小(因为该数字可以被4和8整除)。但是,如果您的尺寸是23,分配的空间将在许多架构上进行四舍五入。

除非你维护某种单独的计数器或索引,否则知道链表大小的唯一方法就是从头开始遍历它。

答案 1 :(得分:0)

正如埃里克的补充一样,我会说:

  1. 据我了解,问题是指列表占用的总字节数。
  2. 确保使用sizeof(list)以了解每个节点占用的字节数。我说“确定”,因为sizeof(list)的结果取决于架构,尤其是内存对齐和字大小。
  3. 现在,如果出于任何原因禁止使用sizeof(list) ,那么您可以通过以下方式进行计算:

    size_t my_sizeof_of_list()
    {
      struct list * zero = 0;
      return (size_t) &zero[1];
    }
    

    此代码可以适用于list以外的其他类型,并包含泛型类型。

    1. 如果您知道列表中元素的数量,则总字节数为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)))