指向struct的指针中的内存分配

时间:2018-07-20 09:58:14

标签: 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;
}

在这里,我创建了particle_t结构的列表。假定使用指针的优点之一是您不需要复制数据。因此,让我们以为我想从该主列表中创建一些小列表。

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

请确保在您自由运行时,将从malloc获得的值准确发送给它,对于每个malloc完全向您免费发送一个值。

无论哪种情况,都请小心并给自己画一张照片,以便了解发生了什么。

答案 1 :(得分:0)

一个指针需要4个字节(32位机器)或8个字节(64位机器)。如果要创建指针列表,则绝对应该为该列表分配内存,然后存储这些指针。简短的答案应该始终分配内存以容纳任何类型的指针(无论是正常的指针还是指向结构的指针),因为结构本身不要求任何内存。