什么时候必须使用malloc来分配内存?

cit*_*nas 10 c malloc memory-management

1)
我必须使用malloc为哪些数据类型分配内存?

  • 对于类似结构,指针的类型,除了基本数据类型,如int
  • 对于所有类型?

2)
为什么我可以运行此代码?为什么不崩溃?我假设我需要先为结构分配内存.

#include <stdio.h>
#include <stdlib.h>

typedef unsigned int uint32;
typedef struct 
{
  int a;
  uint32* b;
}
foo;

int main(int argc, char* argv[])
{
 foo foo2;
 foo2.a = 3;
 foo2.b = (uint32*)malloc(sizeof(uint32));
 *foo2.b = 123;
}
Run Code Online (Sandbox Code Playgroud)

使用不是更好

foo* foo2 = malloc(sizeof(foo));
Run Code Online (Sandbox Code Playgroud)

3) 如何设置foo.b?是引用随机内存还是NULL?

#include <stdio.h>
#include <stdlib.h>

typedef unsigned int uint32;
typedef struct 
{
  int a;
  uint32* b;
}
foo;

int main(int argc, char* argv[])
{
 foo foo2;
 foo2.a = 3;

}
Run Code Online (Sandbox Code Playgroud)

小智 18

C中的所有类型都可以动态地,自动地(在堆栈上)或静态地分配.问题不是类型,而是你想要的生命周期 - 当你希望一个对象存在于创建它的函数范围之外时,或者你事先不知道你需要多大的东西时,你可以使用malloc.


Car*_*rum 9

编辑以解决您编号的问题.

  1. 您必须使用malloc分配数据类型.只有当您希望指针类型指向有效内存时,才必须使用一元&(地址)运算符malloc()或某些相关函数.

  2. 您的代码没有任何问题 - 该行:

    foo foo2;
    
    Run Code Online (Sandbox Code Playgroud)

    在堆栈上分配一个结构 - 然后一切正常.在这个意义上,结构与任何其他变量没有区别.使用自动变量(堆栈分配)或全局变量不是更好或更糟,或者malloc()它们都是不同的,具有不同的语义和选择它们的不同理由.

  3. 在#3中的示例中,foo2.b未定义的值.在您显式初始化之前,任何自动变量都有一个未定义和不确定的值.