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

标签 c pointers malloc

我这样做是为了了解 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结构列表。据说使用指针的优点之一是不需要复制数据。因此,我们假设我想从该主列表中创建一些小列表。

  • 选项 1 memcpy 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/

相关文章:

c - C中的内存泄漏,函数内部的malloc

c - Linux 中的物理位置感知用户空间内存分配(内存 Controller 亲和性)

java - gwan 7.12.6 上的 report.c 和 report.java servlet 出现故障

c - TCP_KEEPIDLE 应该低于 TCP_KEEPINTVL 吗?

c++ - 重新定义 malloc/free with static linking has multiple definition error

c - 相同代码的段错误

c - 排序篮球运动员名字的函数

arrays - 在 C 中查找字符数组的长度

c - 如何正确比较 C 中的字符串?

c - 如何学习C指针?