c - sizeof(结构)、sizeof(字符串)、sizeof(数组)

标签 c sizeof

我很困惑 sizeof 是什么?函数返回。

假设我在 sizeof 的程序中输入以下内容,这就是返回的内容:

sizeof(char) ==  1
sizeof(int) == 4
sizeof(float) == 4
sizeof(long) ==  8
sizeof(double) == 8
sizeof(void *) == 8

sizeof Pointer是 8。
所以如果我 malloc一个长数组:

long *array = (long *)malloc(64)

sizeof()吗?插入malloc我的长数组是等价的吗?

long *array = (long *)malloc(8*sizeof(long))

现在如果我有一个结构:

typedef struct treenode {
    struct treenode *left;
    struct treenode *right;
    void *content;
} Treenode; 

然后我运行 sizeof(Treenode) ,我是否将结构体的所有元素添加在一起?

Pointer + Pointer + void * = 8 + 8 + 8 = 24

我尝试在程序中运行它,但是我得到 sizeof(Treenode)返回 12。

我还想知道为什么当我创建这样的新结构时:

typedef struct country {
    char city[40];
    int population;
    int rank;
}

并尝试 malloc(sizeof(country *))仅分配 8 个字节,而不是结构体的字节。

最后当我这样做的时候sizeof("Korea") ,为什么我的返回值是6而不是5?因为字符串中只有 5 个字符,所以不应该是 5 吗?

最佳答案

我将分别解决每个问题:

  • 这些在您所描述的上下文中是等效的

    long *array = (long *)malloc(64)
    long *array = (long *)malloc(8*sizeof(long))
    

    但是,这不一定在所有机器上都是正确的(如果说在一台机器上 long 是 16 字节),因此此代码不可移植。您应该只使用第二种可移植的方法。

  • 我不确定为什么尺寸声称是 12 - 抱歉。 (您确定所有指针的大小都是 8 吗?)

  • 虽然 country 结构可能非常大,但指向 country 的指针只是一个指针,因此在您的情况下它的大小为 8。
  • 在 C 中,字符串以 null 结尾,因此具有五个字母的字符串有一个尾随 null,这可能是字符串大小的一部分。

关于c - sizeof(结构)、sizeof(字符串)、sizeof(数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27081933/

相关文章:

c - 如何在 Windows 上检测进程的体系结构?

c++ - sizeof() : the size of a class isn't the same as the size of it's members together?

c - #ifdef MACRO 是否等同于注释

c - 如何左移大于 64 位的值?警告 : shift count >= width of type [-Wshift-count-overflow]

c - c程序中输出错误为零

python - C 返回具有错误值的 numpy 数组

c - 变量在声明之前使用是怎么回事?

c++ - 空结构和匿名 union 怪事

在 Objective-C 中检查对象的大小

c - GPU上size_t的sizeof是多少?