sizeof(struct),sizeof(string),sizeof(array)

时间:2014-11-22 20:07:18

标签: 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),我是否一起添加结构的所有元素?

  

指针+指针+ 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个字符吗?

3 个答案:

答案 0 :(得分:2)

我将分别处理每个问题:

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

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

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

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

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

答案 1 :(得分:1)

  1. 如果sizeof(Treenode)为12,那么您不使用64位指针/内存。如果你在其他地方得到不同的结果(sizeof(void *) == 8),那么你必须有不同的目标。

  2. sizeof(country *)是指向country的指针的大小,即 - 与任何其他指针相同。请改用malloc(sizeof(country))

  3. sizeof("Korea")包含字符串空终止符的大小。

答案 2 :(得分:0)

您使用的是哪种架构都很重要 在32位上,每个指针大小为4个字节 在64位上,每个指针大小为8个字节。

因此,如果您运行以下代码:

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

和以下代码:

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

它在64位上是相同的,但不是在32位中。

malloc(sizeof(country *))只分配8个字节,因为(country *)是指针的类型(指向国家结构的指针),每个指针在64位中长8个字节。