c - malloc的作用(正确使用malloc)

标签 c malloc

所以我在这方面很新,如果这听起来像一个愚蠢的问题,我很抱歉

我试图理解 malloc,并创建一个非常简单的程序,它将使用 ASCII 代码打印“ABC”

到目前为止,这是我的代码(我们的教授教给我们的代码)

char *i;
i = malloc(sizeof(char)*4); 
*i = 65;
*(i+1) = 66;
*(i+2) = 67;
*(i+3) = '\0';

我不明白的是,为什么我必须把 malloc 放在那里? 教授告诉我们,如果没有 malloc,程序将无法运行, 但是当我尝试在没有 malloc 的情况下运行它时,程序运行得很好。 那么 malloc 的功能是什么? 我用对了吗?

任何帮助和/或解释将不胜感激

最佳答案

the professor told us the program won't run without the malloc

这不完全正确,正确的措辞应该是:“程序的行为未定义没有malloc()”。

这是因为

char *i;

只是声明一个指向 char 的指针,但没有初始化——这个指针指向某个不确定位置。您可能只是幸运,因为向这个“随机”位置写入值是有效的,不会导致崩溃。我个人将其称为不幸,因为这在您的程序中隐藏了一个错误。 未定义的行为 意味着任何事情都可能发生,包括“正确”的程序执行。

malloc()将动态请求一些可用内存并返回指向该内存的指针,因此在 malloc() 之后,你知道 i指向您可以使用的 4 个字节的内存。如果malloc()由于某种原因失败(没有更多可用内存),它返回 NULL -- 你的程序应该在写入 *i 之前对其进行测试.

综上所述,程序当然可以在没有 malloc() 的情况下工作.你可以写

char i[4];

i将是一个局部变量,有 4 个字符的空间。


最后的旁注:sizeof(char)定义为 1 , 所以你可以写 i = malloc(4); .

关于c - malloc的作用(正确使用malloc),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44604395/

相关文章:

c - 为什么下面的程序不打印相同的字符串两次?

c++ - 代码块电源功能在 c 中不起作用

c++ - Freertos 硬故障分析——堆栈寄存器

c - #define 的数组格式(C 预处理器)

c - 函数内动态重新分配 - C

c - 从虚拟内存地址查找物理内存地址

c - C 中的递归合并排序和内存分配

c - 为 C 结构中的 char* 属性分配内存

对于 'char' 类型,calloc 2 GB 内存失败,但对于 'short' 类型成功

c - Malloc 的 char 数组有意外的输出