gpt4 book ai didi

c - c 中的 malloc 和堆

转载 作者:行者123 更新时间:2023-12-02 08:51:47 26 4
gpt4 key购买 nike

考虑下面的代码:

#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”,我假设这是List对象中“int size”占用的4个字节?而“int* data”的大小是0,因为没有分配给数据?int 指针的大小也是 4 个字节,所以 List 类型总共需要 8 个字节?或者还有其他事情发生?有人可以帮助我详细了解这一切吗?

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

这里真的需要一些帮助

提前致谢。

最佳答案

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

sizeof(list) 在您的例子中,因为变量列表的类型是 List*sizeof(List*) 相同。

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

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

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

这是 C++,但是你应该写

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

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

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

关于c - c 中的 malloc 和堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8028126/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com