什么时候需要在指针上使用malloc分配动态内存?

noe*_*noe 2 c malloc pointers

我无法完全理解C中的malloc()函数,更准确地说是在需要使用它时.

当我声明一个指向全局结构的指针时,

struct Position* currentPositionPtr;
Run Code Online (Sandbox Code Playgroud)

我需要使用malloc初始化动态内存吗?或者,稍后在需要时简单地将结构的指针指定给它是好的做法,例如

currentPositionPtr = getPosition();
Run Code Online (Sandbox Code Playgroud)

where getPosition()返回指向"struct Position"的指针.

小智 8

怎么getPosition()办?

如果它返回一个有效的指针struct Position,那么当然你不需要为结构分配两次内存.我希望你的函数并不会是这样的:

struct Position *getPosition()
{
    struct Position p = { x, y };
    return &p;
}
Run Code Online (Sandbox Code Playgroud)

因为这会表现出未定义的行为(通过返回指向块作用域自动对象的指针).通常,您宁愿返回已经使用过的 malloc()指针:

struct Position *getPosition()
{
    struct Position *p = malloc(sizeof(*p));
    p->x = 42;
    p->y = 1337;
    return p;
}
Run Code Online (Sandbox Code Playgroud)

然后,再次,您不需要额外的呼叫malloc().

但是,如果负责分配的不是被叫函数那么,那么......调用者是:

void getPosition(struct Position *p)
{
    p->x = 42;
    p->y = 1337;
}
Run Code Online (Sandbox Code Playgroud)

在后一种情况下,您需要像这样调用它:

struct Position *p = malloc(sizeof(*p));
getPosition(p);
Run Code Online (Sandbox Code Playgroud)

如果你需要你的结构来存活函数返回,或者

struct Position p;
getPosition(&p);
Run Code Online (Sandbox Code Playgroud)

如果你不这样做.