gpt4 book ai didi

c - 指向结构体指针的内存分配

转载 作者:行者123 更新时间:2023-11-30 14:47:19 25 4
gpt4 key购买 nike

我这样做是为了了解 C 中的内存分配要求。让我们看这个小例子:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

typedef struct {
float x[2];
float y[2];
} particle_t;


int main()
{
srand((unsigned int)time(NULL));
int i;

particle_t* list = (particle_t*) malloc(10*(sizeof(particle_t)) );
particle_t** pp = (particle_t**) malloc(10*(sizeof(particle_t*)) );
//for(int i=0;i< 10;i++)
// pp[i] = (particle_t*) malloc((sizeof(particle_t)) );
//populate
for ( i=0; i<10; i++){
list[i].x[0]= ((float)rand())/RAND_MAX;
list[i].x[1]= ((float)rand())/RAND_MAX;
list[i].y[0]= ((float)rand())/RAND_MAX;
list[i].y[1]= ((float)rand())/RAND_MAX;
pp[i] = &list[i];
}
//Read
for(int i=0;i<10;i++)printf("list[%d].X(0) = %f\n",i, list[i].x[0]);
for(int i=0;i<10;i++)printf("pp[%d].X(0) = %f\n",i, pp[i]->x[0]);
printf("********************************\n");
//Write
for(int i=0;i<10;i++){
pp[i]->x[0] = 5.9 * ((float)rand())/RAND_MAX;
pp[i]->x[1] = 5.9 * ((float)rand())/RAND_MAX;
pp[i]->y[0] = 5.9 * ((float)rand())/RAND_MAX;
pp[i]->y[1] = 5.9 * ((float)rand())/RAND_MAX;
}
for(int i=0;i<10;i++)printf("list[%d].X(0) = %f\n",i, list[i].x[0]);
for(int i=0;i<10;i++)printf("pp[%d].X(0) = %f\n",i, pp[i]->x[0]);


return 0;
}

这里我创建了一个article_t结构列表。据说使用指针的优点之一是不需要复制数据。因此,我们假设我想从该主列表中创建一些小列表。

  • 选项 1memcpy list 中的每个元素到不同的小列表。

  • 选项 2创建一个指向 list 的指针列表。

使用选项 2,我创建了一个指向 article_t 结构的指针。然后为我需要的尽可能多的指针分配内存(示例中为 10 个)。现在我不确定如何继续。我本以为我需要为每个指向粒子_t结构的指针分配内存。然而,正如我们在示例中看到的那样,这不是必需的,至少并非总是如此。但这可能取决于编译器。

问题是,即使可能不需要,我是否应该始终分配内存来容纳指向结构的指针?

最佳答案

您在示例中创建的是一个粒子数组,以及另一个指向粒子的指针数组。第一个循环将数据填充到两个数组中,以便位于 pp[i] 中的指针指向 list[i] 中的粒子。

如果您的问题意味着“我是否应该始终分配内存来容纳指向结构的指针”意味着“我是否应该始终运行 malloc 为我创建的每个结构指针腾出空间”,那么答案是“否”,如您的代码所示。非 NULL 指针应该指向某个有效的内存空间。通常,您可以通过调用 malloc 立即分配新空间。但您也可以使指针指向已经存在且正在使用的空间。在您的情况下,第一个数组的空间现在已有效共享。

确保当您自由运行时,您发送的值与从 malloc 获得的值完全相同,每个 malloc 正好释放一个值。

无论哪种情况,都要小心,给自己画一张图,这样你就知道发生了什么。

关于c - 指向结构体指针的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51439981/

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