我这样做是为了了解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
结构的指针分配内存。但是,正如我们在示例中看到的那样,这不是必需的,至少并非总是如此。它可能取决于编译器。
问题是,即使可能不需要,我是否应该总是分配内存来容纳指向结构的指针?
答案 0 :(得分:1)
在示例中创建的是一个粒子数组,以及另一个指向粒子的指针数组。您的第一个循环将数据填充到两个数组中,以便位于pp[i]
中的指针指向list[i]
中的粒子。
如果您的问题是“我应该始终分配内存以容纳指向结构体的指针”是什么意思:“我应该始终运行malloc为我创建的每个结构体指针腾出空间”,答案是“否”,如代码所示。 。非NULL指针应指向一些有效的内存空间。通常,您可以通过调用malloc立即分配新空间。但是您也可以使指针指向已经存在并且正在使用的空间。您的情况是,第一个阵列中的空间现已有效共享。
请确保在您自由运行时,将从malloc获得的值准确发送给它,对于每个malloc完全向您免费发送一个值。
无论哪种情况,都请小心并给自己画一张照片,以便了解发生了什么。
答案 1 :(得分:0)
一个指针需要4个字节(32位机器)或8个字节(64位机器)。如果要创建指针列表,则绝对应该为该列表分配内存,然后存储这些指针。简短的答案应该始终分配内存以容纳任何类型的指针(无论是正常的指针还是指向结构的指针),因为结构本身不要求任何内存。