- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在 C(或 C++)的链表实现中,节点的大小和指针变量的生命周期是多少?例如:
struct node
{
int data;
struct node *next;
}*ptr=NULL;
现在我想知道节点的大小:是不是 4 个字节,如果是,怎么办?其次,指针在整个程序执行过程中存在多长时间?最后,将 *ptr
称为实例变量或数据成员或对象是否合适?
最佳答案
一般不可能知道节点的大小。但是,对于特定平台和一组库,您可以在编译时知道节点的大小。
sizeof(struct node)
会告诉你节点的大小。请注意,它可能不是节点内所有成员组合的实际大小。有时,需要填充以使结构内的成员在正确操作所需的内存对齐边界上对齐。
此外,指针没有特定的大小。它们足够大以容纳所需的内存地址,但这是它们必须满足的唯一要求。 32 位和 64 位环境之间的指针大小存在显着差异,即使不在同一硬件上的两个受支持的位环境之间转换,不同的硬件平台可能也有不同的内存要求存储一个指针值。
“4 个字节用于存储指针”是由于普遍的误解,即所有使用 C 语言的计算机都是 Intel CPU,属于 Pentium 系列芯片,只能运行 32 位代码。这在当时是一个不正确的假设,现在假设它同样不正确。
即使考虑到这一点,结构的数组也可能需要数组元素之间的填充以实现正确的内存对齐。因此,即使您知道结构的大小,也无法确保 X
元素的数组适合 X * sizeof(struct node)
的内存区域> 字节。
使用 sizeof(...)
找到您要寻找的答案,但要确保您想要计算大小的几乎所有内容都在 sizeof(...)
运算符。
就指针的生命周期而言,只要程序在运行,它就一直存在;然而,存储在 node->next
中的值可能实际上没有引用有意义的地址。 node->next
旨在保存一个地址,但是有太多方法可以欺骗 node->next
指向未指定地址开头的地址满足 struct node
需要的位模式。
C 语言的这个“问题”在后来的语言中得到了一定程度的修复,旨在通过使指针类型操作成为不可能来“改进”C。相反,语言允许指针操作的安全子集,这意味着您实际上没有指针(因此他们称其为引用)。 Java 和 C# 就是两种这样的语言,但有许多语言否认对指针进行真正危险的操作。
将指针称为变量的实例是不恰当的,因为它实际上是一个保存内存地址的变量。没有严格要求它保存的内存地址包含满足指针“类型”的位模式。这只是 C++ 保留的遗留 C 问题之一,以便与 C 兼容。此外,实例变量倾向于建议面向对象的术语,而 C 不能(以其默认形式)提供面向对象的保证,因此应用C 的面向对象编程术语是不合适的。
同样,结构不是类,结构的成员与类的成员遵循的规则略有不同。最大的“略有不同”的规则是结构的成员通常可以公开访问,除非你真的非常小心地从程序的其余部分隐藏结构的声明(这将需要大量的 C 体操来做和制作你的程序仍然有效)。
关于c - C 中链表实现中节点的大小和生命周期是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18326234/
我有一台 MySQL 服务器和一台 PostgreSQL 服务器。 需要从多个表中复制或重新插入一组数据 MySQL 流式传输/同步到 PostgreSQL 表。 这种复制可以基于时间(Sync)或事
如果两个表的 id 彼此相等,我尝试从一个表中获取数据。这是我使用的代码: SELECT id_to , email_to , name_to , status_to
我有一个 Excel 工作表。顶行对应于列名称,而连续的行每行代表一个条目。 如何将此 Excel 工作表转换为 SQL 表? 我使用的是 SQL Server 2005。 最佳答案 这取决于您使用哪
我想合并两个 Django 模型并创建一个模型。让我们假设我有第一个表表 A,其中包含一些列和数据。 Table A -------------- col1 col2 col3 col
我有两个表:table1,table2,如下所示 table1: id name 1 tamil 2 english 3 maths 4 science table2: p
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 1 年前。 Improve th
下面两个语句有什么区别? newTable = orginalTable 或 newTable.data(originalTable) 我怀疑 .data() 方法具有性能优势,因为它在标准 AX 中
我有一个表,我没有在其中显式定义主键,它并不是真正需要的功能......但是一位同事建议我添加一个列作为唯一主键以随着数据库的增长提高性能...... 谁能解释一下这是如何提高性能的? 没有使用索引(
如何将表“产品”中的产品记录与其不同表“图像”中的图像相关联? 我正在对产品 ID 使用自动增量。 我觉得不可能进行关联,因为产品 ID 是自动递增的,因此在插入期间不可用! 如何插入新产品,获取产品
我有一个 sql 表,其中包含关键字和出现次数,如下所示(尽管出现次数并不重要): ____________ dog | 3 | ____________ rat | 7 | ____
是否可以使用目标表中的LAST_INSERT_ID更新源表? INSERT INTO `target` SELECT `a`, `b` FROM `source` 目标表有一个自动增量键id,我想将其
我正在重建一个搜索查询,因为它在“我看到的”中变得多余,我想知道什么 (albums_artists, artists) ( ) does in join? is it for boosting pe
以下是我使用 mysqldump 备份数据库的开关: /usr/bin/mysqldump -u **** --password=**** --single-transaction --databas
我试图获取 MySQL 表中的所有行并将它们放入 HTML 表中: Exam ID Status Assigned Examiner
如何查询名为 photos 的表中的所有记录,并知道当前用户使用单个查询将哪些结果照片添加为书签? 这是我的表格: -- -- Table structure for table `photos` -
我的网站都在 InnoDB 表上运行,目前为止运行良好。现在我想知道在我的网站上实时发生了什么,所以我将每个页面浏览量(页面、引荐来源网址、IP、主机名等)存储在 InnoDB 表中。每秒大约有 10
我在想我会为 mysql 准备两个表。一个用于存储登录信息,另一个用于存储送货地址。这是传统方式还是所有内容都存储在一张表中? 对于两个表...有没有办法自动将表 A 的列复制到表 B,以便我可以引用
我不是程序员,我从这个表格中阅读了很多关于如何解决我的问题的内容,但我的搜索效果不好 我有两张 table 表 1:成员 id*| name | surname -------------------
我知道如何在 ASP.NET 中显示真实表,例如 public ActionResult Index() { var s = db.StaffInfoDBSet.ToList(); r
我正在尝试运行以下查询: "insert into visits set source = 'http://google.com' and country = 'en' and ref = '1234
我是一名优秀的程序员,十分优秀!