我正在尝试在函数中分配一个结构数组。
我的结构如下:
typedef struct{
uint16_t taskNumber;
uint16_t taskType;
double lat;
double lon;
double speed;
uint8_t successCriteria;
uint16_t successValue;
uint8_t nextPoint;
}missionPoint;
在我的代码中,我声明了一个missionPoint-pointer,然后我将其传递给函数,该函数将在解析文件并计算出需要的大小后动态分配它。 目前这是我的代码的样子:
missionPoint* mission; //declaring the pointer
parseMission(mission);
然后parseMission函数将解析一个特定的文件并找出我需要多少个missionPoints,然后按以下方式分配它:
mission = (missionPoint*) malloc(n * sizeof(missionPoint));
其中n是我需要解析的任务数量。
问题是在函数中我可以看到正确的值,但不能在它之外;一旦函数返回它就像没有发生任何事情。
我很感激你的帮助,使函数修改原始指针,我可以看到函数外部的数据。
答案 0 :(得分:4)
您需要传递对指针的引用,即双指针,因为地址本身将被修改:
missionPoint *mission;
parseMission(&mission);
parseMission
的论点现在应该是missionPoint **
而不是missionPoint *
:
*mission = (missionPoint*) malloc(n * sizeof(missionPoint));
如果您只想修改mission
所指向的内存,则无需这样做,但由于您要为指针本身分配新值,因此无法避免。
另请注意,在C中无需转换malloc
的返回值。
答案 1 :(得分:1)
将引用(即指针)传递给mission
指针,而不是mission
指针本身的值。所以你的函数声明如下:
void parseMission(missionPoint** pointer_ref);
而不是:
void parseMission(missionPoint* pointer_val);
然后将mission
的地址(即&mission
)作为parseMission
的参数值传递。
答案 2 :(得分:1)
认为C中的指针只是一个整数,存储一些内存地址。
认为malloc
分配一些内存并返回该内存的地址(一个新指针)。
理解这个片段将打印“2”,无论被调用函数对传递的值执行什么操作。
int a = 2;
doSomething(a);
printf("%d\n",a);
一旦你理解了这一切,就可以预测这段代码会产生什么,以及为什么需要传递“指针指针”(指向指针的指针)而不是指针本身(指针的值)你的分配器功能。
void remalloc(char * p1) {
printf("pointer before remalloc (inside function): %X\n",(unsigned int)(p1));
free(p1);
p1 = (char*)malloc(200000);
printf("pointer after remalloc (inside function): %X\n",(unsigned int)(p1));
}
int main(){
char * p;
printf("pointer before malloc: %X\n",(unsigned int)(p));
p = (char*)malloc(10);
printf("pointer after malloc: %X\n",(unsigned int)(p));
remalloc(p);
printf("pointer after remalloc: %X\n",(unsigned int)(p));
}