2011-11-06 88 views
2

考虑下面的代码:malloc和堆在C

#include "list.h" 
struct List 
{ 
    int size; 
    int* data; 
}; 
List *list_create() 
{ 
    List *list; 
    printf("%d %d",sizeof(list),sizeof(List)); 
    list = malloc(sizeof(list)); 
    assert(list != NULL); 
    if (list != NULL) { 
     list->size = 0; 
    } 
    return list; 
} 

印出数为“4 8”,我相信这是由“INT大小”在列表对象所采取的4个字节和大小“int * data”为0是什么都没有分配给数据? int指针的大小也是4字节,所以类型List共占用8个字节?还是还有其他的事情呢?有人能帮我详细了解这一切吗?

然后malloc()从堆中获取4个字节并将地址分配给指针列表?后来主要如果我做“list-> data [i] = 1;”这会给我一个运行时错误为什么?是否因为我不能改变堆中的内容?但如果我做“列表 - >大小++”这将工作, 是不是整个列表对象是在堆?

真的需要这里一些帮助提前

感谢。

+0

如果sizeof(struct List)''怎么办? – Aif

+0

您的运行时错误是因为您尚未初始化任何指针。你也需要为它分配空间。 – Ryan

+0

这里没有运行时错误。 –

回答

4

sizeof(List*)是指向List结构体的指针的大小。

sizeof(list)在您的情况下,因为变量列表类型为List*sizeof(List*)相同。

sizeof(List)取而代之的是struct List的大小,它包含两个32位变量(我假设你明显地使用了一个32位编译器),一个整数和一个指针,并且你的编译器决定你的结构的正确大小是8个字节。

指向类型的指针通常是32位编译器中的4个字节和64位编译器中的8个字节。作为一个方面说明,阅读你的代码,但是我读过你永远不会初始化list-> data,你应该把它初始化到我猜想的某个地方。

这是C++然而,你应该写

typedef struct { ... } List; // This is C. 

sizeof操作符在编译时计算,而不是在运行时,它给出了一个类型的大小只有信息。例如,你不能知道在sizeof的动态数组中有多少元素,如果你试图完成这个,sizeof(指针)会给你指针类型的字节大小。

因为有所了解什么是一个指针,什么是一个数组,我建议你读http://www.lysator.liu.se/c/c-faq/c-2.htmlhttp://pw1.netcom.com/~tjensen/ptr/pointers.htm

+0

错误:指针大小由编译器决定,而不是系统。在64位系统上进行32位编译并不是一件罕见的事情,这意味着sizeof(void *)= 4 – chacham15

+0

Ok :)重新表达,但尚不清楚。 –

+0

您也忘记了对齐会影响结构的大小 – chacham15

2

技术上你的代码中有一个错误。

代码应为:sizeof(struct List)typedef struct List List;某处。

但是,sizeof(list)是变量列表的大小。由于名单是一个指针,它相当于sizeof(void*),您的系统上安装/编译器是4

sizeof(struct List)是这是sizeof(int) + sizeof(int*) + any alignment issues的结构的大小。对齐的东西经常被遗忘,但是非常重要,因为它可以以意想不到的方式改变结构的大小。