gpt4 book ai didi

c - 使用指针而不是数组来构造 hack

转载 作者:太空宇宙 更新时间:2023-11-04 01:06:43 27 4
gpt4 key购买 nike

以下制作可变大小结构的方法有什么问题?

  struct tode{
int g;
int *p;
};

struct tode *lp = malloc(sizeof(struct tode) + (10 * sizeof(int)));

注意:这是完全错误的,但在我的脑海中造成了困惑,因此试图讨论

最佳答案

结构中的

p 是指向 int 的指针,而不是数组。所以它不会编译。您应该使用零长度数组或灵活的数组成员为其动态分配内存。但是,它必须是最后一个结构成员。这是您声明它的方式。

struct tode {
int g;
int p[]; // p is a zero length array here, not a pointer
};

// sizeof(tode) is 4 on a 32-bit machine

这是您可以声明零长度数组的少数情况之一(我还记得其他情况是当您声明 extern 数组时)。由于零长度成员是不完整类型,您必须先分配内存,然后才能对其进行任何操作。

struct tode *lp = malloc(sizeof(tode) + 10*sizeof(int));

// after you are done with lp

free(lp);

此处,malloc 参数中的 10*sizeof(int) 部分动态分配数组。 sizeof(tode) 没有考虑 p 因为它是一个不完整的类型。在上面的语句之后,p 是一个包含 10 个 int 的数组。

但是,如果你这样做了

struct tode {
int g;
int *p; // p is a pointer
};

// sizeof(tode) is 8 on a 32-bit machine

然后你会动态分配结构为

struct tode *lp = malloc(sizeof(tode));

// lp->p is of type (int *) so it can contain any int address

lp->p = malloc(10 * sizeof(int));

// after you are done with lp

free(lp->p);
free(lp);

您还可以使用designated initializer 在堆栈上分配和初始化结构。 (C99) 如 Jens 所示

struct tode lv = {.g = 10, .p = malloc(10 * sizeof(int))}; 

但是,在变量 lv 超出范围之前,您应该释放 lv.p 指向的内存作为

free(lv.p);

关于c - 使用指针而不是数组来构造 hack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21795266/

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