【问题标题】:Size of linked list using the addresses of nodes使用节点地址的链表大小
【发布时间】:2015-10-23 22:31:11
【问题描述】:

名单:

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....。数字每次都不一样,但不是我想要的。

【问题讨论】:

  • 为什么代码不用sizeof就不用sizeof来查找大小?
  • 我要创建一个项目,我被要求不要使用它。
  • 奇怪的要求。代码可以通过找到最小的绝对差并乘以单元格数来报告最大大小。祝你好运,不被允许使用sizeof。向那些指导的人询问原因可能很有用。

标签: c pointers linked-list


【解决方案1】:

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

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

他的号码每次都不一样

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

每个节点彼此相差 24 个字节

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

除非您维护某种单独的计数器或索引,否则了解链表大小的唯一方法是从头到尾遍历它。

【讨论】:

  • 你能解释一下我该怎么做吗?我对 c 没有深入的了解。
  • @Maria 遍历列表时,数一数有多少元素。总大小是计数时间sizeof(struct list)。没有sizeof,就没有办法做到这一点。
  • 我不确定是否所有架构都能保证 24 字节。也许 32 位更小
  • @Irleon:这不是保证。 malloc 的一些实现甚至可能分配更大的块。我想你通常会看到 4 字节或 8 字节对齐,但肯定不会总是这样。
【解决方案2】:

作为对 Eric 的补充,我想说:

  1. 据我了解,问题是指列表占用的总字节数。
  2. 一定要使用sizeof(list)才能知道每个节点占用的字节数。我说“确定”是因为sizeof(list) 的结果取决于架构,尤其是内存对齐和字长。

现在,如果出于某种原因禁止使用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)。在最后一种情况下,最好只计算总大小,而不是累加总大小,这样更简单、更快捷。

【讨论】:

    【解决方案3】:

    找出列表的大小(不使用 sizeof)

    sizelist = (char *)(((struct list *)0)+1)-(char *)(((struct list *)0));
    

    #define sizelist ((char *)(((struct list *)0)+1)-(char *)(((struct list *)0)))
    

    【讨论】:

      猜你喜欢
      • 2013-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-02
      • 2019-07-19
      • 1970-01-01
      • 2017-11-04
      • 1970-01-01
      相关资源
      最近更新 更多