gpt4 book ai didi

c - 结构中的 `char` 之后是否有零字节?

转载 作者:行者123 更新时间:2023-12-01 12:39:36 24 4
gpt4 key购买 nike

我试图确保我理解这里隐藏的假设是什么。

这里的代码给出了正确的结果。

#include <stdio.h>
#include <stdlib.h>

struct branch
{
char flag; //value
struct branch *l; //left child
struct branch *r; //right child
};

struct branch c={'c',NULL,NULL};
struct branch e={'e',NULL,NULL};
struct branch f={'f',NULL,NULL};
struct branch b={'b',&c,NULL};
struct branch d={'d',&e,&f};
struct branch a={'a',&b,&d};

void preorder(struct branch* t)
{
printf(&t->flag); //Seems ugly and errorprone
if(t->l) preorder(t->l);
if(t->r) preorder(t->r);
}

int main()
{
preorder(&a);
}

如预期的那样,输出是 abcdef

有人可以证实我的怀疑吗,这之所以有效,是因为两件事:

  1. 结构成员在 n 字节边界处对齐 (n != 1)(当询问 sizeof()-s 时,似乎 n = 4)
  2. 第一个成员(char)未使用的直到 n 字节边界的字节被清零。

我看不出 printf 正常工作的其他解释,因为它需要一个零终止的 char[]。

此外,这样做是否明智(在单目标嵌入式代码情况之外,优化可能超过可读性和可移植性问题),即。这些假设或多或少普遍适用吗?

第一周断断续续地弄乱 C,所以我很新手。

最佳答案

要验证您的假设,您可以在运行时使用调试器或使用一些 printf 检查代码。

例如:

  char *ptr=(char *)&t;
printf("%02X %02X %02X %02X\n",ptr[0],ptr[1],ptr[2],ptr[3]);

事实上,您确定的假设通常都是正确的,但您不能依赖它们。我肯定会说

  printf(&t->flag);

显然是错误的,因为它依赖于 standard.tt 不保证的假设

关于c - 结构中的 `char` 之后是否有零字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26201823/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com