malloc
(或其他内存分配功能)在您需要系统为您提供内存时需要。
所以是的,当你这样做时
struct Position* currentPositionPtr;
您将需要致电malloc()
:
currentPositionPtr = malloc(sizeof(struct Position));
或将指针分配给已分配内存块的地址:
struct Position globalPos;
void func(void) {
struct Position pos;
struct Position* currentPositionPtr = &pos; //ok
struct Position* globalPosPtr = &globalPos; //also ok
...
}
因为您所做的只是声明指针,而不是为结构保留空间。
但是,如果您的指针是global,则将其分配给堆栈分配的内存可能很危险。考虑以下:
struct Position *globalPosPtr = NULL;
void foo(void) {
struct Position pos;
globalPosPtr = &pos;
//can dereference globalPosPtr with no problems here
...
}
void bar(void) {
foo();
//globalPosPtr is invalid here
...
}
至于您关于拥有另一个返回指针的函数的问题:
getPosition()
将需要使用malloc
或其他一些内存分配函数本身。所以这样做非常好,如果您通常希望将结构中的值初始化为某些值,那么这样做是有意义的。但是,请记住,即使您malloc
在其他函数内部调用,free
当您完成使用它时也需要内存以防止内存泄漏。
要回答标题中的问题,每当您将某个东西声明为指针时,如果您想使用它,就需要给它一些指向的东西。如果你想让它指向一个新的东西,你需要用malloc()
或相关的函数动态分配它。