【问题标题】:Size of pointer variable in a structure结构中指针变量的大小
【发布时间】:2013-08-01 11:56:11
【问题描述】:
int main()
{
    struct
    {
        char *name_pointer;
        char all[13];
        int foo;
    } record;

    printf("%d\n",sizeof(record.all));
    printf("%d\n",sizeof(record.foo));
    printf("%d\n",sizeof(record));

    return 0;
}

我想要结构中指针变量“*name_pointer”的大小......

【问题讨论】:

  • 阅读:What does sizeof(&arr) return? 了解name_pointerall 之间的区别。
  • sizof(char*);会告诉你
  • sizeof(record.name_pointer);
  • 你想要sizeof(record.name_pointer)strlen(record.name_pointer) 吗?
  • 是什么阻止了你 sizeof(record.name_pointer);

标签: c pointers structure sizeof


【解决方案1】:

要获取指针的大小,请使用

printf("%d\n", (int) sizeof(record.name_pointer));

您可能会得到 2、4、6、8 等。


要获取指针(char)指向的数据的大小,请使用

printf("%d\n", (int) sizeof(*record.name_pointer));

你应该得到 1。


要获取指针指向的字符串的字符串长度,假设record.name_pointer指向合法数据,使用

printf("%d\n", (int) strlen(record.name_pointer));

顺便说一句,正如@alk 所说以及为什么上面的(int) 强制转换,与sizeof() 一起使用的合适的转换说明符包括“z”前缀。 sizeof()strlen() 的结果是 size_t 类型。尽管size_tint 通常是相同的,但在许多系统中它们的大小不同。而且由于 sizeof() 是“无符号整数类型”(C11 6.5.3.4),我推荐

printf("%zu\n", sizeof(...

【讨论】:

  • 在第二个 - 指向的数据是一个字符串 - 而不是第一个字符。所以这是错误的。
  • Nitpick:当strlen() 返回size_t 时,适当的转换说明符应以适当的长度修饰符z 为前缀,以变为zd
  • @ManojAwasthi: name_pointer 被定义为char *,所以它正好指向一个字符。所以一切都很好。
  • @alk 是的 - 我同意 - 想过这一点,但不确定是否将改进添加到基本问题中。
  • @Manoj Awasthi record.name_pointer 是指向 char 的指针,因此 sizeof(*record.name_pointer) 将为 1。由于 C 中的字符串是一个可变长度的字符数组,并且字符串值是通过第一个 char 的地址传递的,所以record.name_pointer 是否使用 仅指向 1 char 、字符串或固定字符数组与 OP 的代码 sn-p 没有区别。
【解决方案2】:

指针变量总是(32 位系统架构)大小为 4。 如果您有 64 位系统架构,则为 8。

【讨论】:

  • 删除 always 添加 in your system
  • 不适用于 64 位系统。那里是 8 点。还有其他的......!
【解决方案3】:

我相信在 sizeof 中使用数据类型而不是原生数据类型的变量是一个好主意。所以使用:

sizeof(char *)

【讨论】:

  • 真的吗?我更喜欢使用变量,因此如果您更改变量类型,代码通常会保持正确。
【解决方案4】:

使用以下代码:

printf("%d\n", (int) sizeof(record->name_pointer)/4);

【讨论】:

  • 提供解释和可行的解决方案会更有帮助。
  • 这行不通。 record 不是指针,因此您不能使用 -> 取消引用它。另外,你为什么要除以4?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 2021-10-15
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多