【问题标题】:What's the difference for sizeof in C to calculate char a[] and char *a? [duplicate]C中sizeof计算char a[]和char *a有什么区别? [复制]
【发布时间】:2018-09-07 00:49:57
【问题描述】:
#include <stdio.h>
int main(void)
{

    char a[] = "Love you!";
    char *b = "Love you!";

    printf("%s\n", a); 
    printf("Length: %d\n", sizeof(a));

    printf("%s\n", b); 
    printf("Length: %d\n", sizeof(b));

    return 0;
}

看上面的代码。

这是输出:

Love you!
Length: 10
Love you!
Length: 8

我理解 char a[] = "Love you!" 有 10 个字符,末尾有一个不可见的 '\0'。

我没有得到的是 char *b 的长度只有 8 个,而其中的字符可以完美打印。

C中sizeof计算char a[]和char *a有什么区别?

【问题讨论】:

  • 也许您错误地将“数组”的内存模型视为实际上是一个数组加上一个指针。但是没有指针,只有数组。

标签: c pointers char


【解决方案1】:

数组和指针是不同的东西。

char a[] = "Love you!" 只是char a[10] = "Love you!" 的语法糖。它创建一个变量,该变量是一个包含十个char 类型对象的数组。所以sizeof a会给你10chars的大小。

char *b = "Love you!" 创建一个变量,它是一个指针,并使其指向字符串文字 "Love you!" 的第一个字符。所以sizeof b 会给你一个指向char 的指针的大小。

【讨论】:

  • …在 64 位系统上,一个指针的大小将是 8 字节(64 位)。如果您在 32 位系统上编译并运行此代码,sizeof b 将是 4。
  • 可能。但请记住,即使在单个系统中,指向不同类型的指针也可能具有不同的大小。
  • @HarryCutts re sizeof b would be 4nn 位系统中更多地描述本机整数处理宽度而不是指针大小。许多系统确实使用相同大小的本机整数和指针 - 所以在那里没有区别。然而,当它们不同时,n 通常不是指针大小,而是原生整数宽度。
猜你喜欢
  • 2014-07-28
  • 2018-03-05
  • 2012-03-16
  • 1970-01-01
  • 2019-06-10
  • 2012-08-14
  • 2021-08-07
  • 2017-04-02
  • 1970-01-01
相关资源
最近更新 更多