C中的malloc和堆

pyt*_*iku 2 c pointers heap-memory

考虑下面的代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

打印出来的数字是“4 8”,我假设这是 List 对象中“int size”占用的 4 个字节?“int* data”的大小为 0 是因为没有分配给数据?int 指针的大小也是 4 个字节,所以 List 类型总共占用 8 个字节?或者还有其他事情发生?有人能帮我详细了解这一切吗?

那么 malloc() 从堆中获取 4 个字节并将地址分配给指针列表?如果我执行“list->data[i]=1;”,则稍后在 main 中 这会给我一个运行时错误为什么?是因为我不能改变堆中的内容吗?但是如果我做“list->size++”这会起作用,不是整个列表对象都在堆中吗?

这里真的需要一些帮助

提前致谢。

Sal*_*iti 5

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

sizeof(list)在您的情况下,由于变量列表的类型List*sizeof(List*).

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

类型指针在 32 位编译器中通常为 4 字节,在 64 位编译器中为 8 字节。

作为旁注,阅读您的代码,但我读到您从未初始化列表-> 数据,您应该将其初始化为我猜的某个地方。

这是 C++ 但是,您应该编写

typedef struct { ... } List; // This is C.
Run Code Online (Sandbox Code Playgroud)

sizeof 运算符在编译时计算,而不是在运行时计算,它只提供类型大小的信息。例如,您无法通过 sizeof 知道动态数组中有多少元素,如果您试图完成此操作,则 sizeof(pointer) 将为您提供指针类型的字节大小。

关于什么是指针和什么是数组,我建议您阅读http://www.lysator.liu.se/c/c-faq/c-2.htmlhttp://pw1。 netcom.com/~tjensen/ptr/pointers.htm