malloc的功能(正确使用malloc)

时间:2017-06-17 12:02:53

标签: c malloc

所以我对此很新,抱歉,这听起来像一个愚蠢的问题

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

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

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

我不明白的是,为什么我必须把malloc放在那里? 教授告诉我们,这个项目在没有malloc的情况下不会运行, 但是当我尝试在没有malloc的情况下运行它时,程序运行得很好。 那么malloc的功能是什么呢? 我甚至正在使用它吗?

任何帮助和解释都会非常感激

3 个答案:

答案 0 :(得分:3)

  教授告诉我们,该计划在没有malloc的情况下运行

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

原因是

char *i;

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

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

所有这些都说,当然程序可以在没有malloc()的情况下工作。你可以写

char i[4];

i将是一个局部变量,可容纳4个字符。

最后的注释:sizeof(char)被定义为1,因此您只需撰写i = malloc(4);

答案 1 :(得分:2)

不幸的是,"运行良好"标准证明了C程序没有任何意义。大量运行完成的C程序具有未定义的行为,这种行为不会在您的特定平台上显现出来。

您需要使用特殊工具才能看到此错误。例如,您可以通过valgrind运行代码,并看到它访问未初始化的指针。

对于malloc,您不必在代码中使用动态缓冲区。在自动内存中分配缓冲区是完全没问题的,如下所示:

char buf[4], *i = buf;

答案 2 :(得分:0)

你必须为内存分配空间。在下面的示例中,我没有为i分配内存,这导致了分段错误(您正在尝试访问您无权访问的内存)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
  char *i;
  strcpy(i, "hello");
  printf("%s\n", i);
  return (0);
}

输出:分段错误(核心转储)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
  char *i;
  /*Allocated 6 spots with sizeof char +1 for \0 character*/
  i = malloc(sizeof(char) * 6);
  strcpy(i, "hello");
  printf("%s\n", i);
  return (0);
}

结果:你好

Malloc允许您创建空间,因此您可以写入内存中的某个位置。在第一个例子中,“没有malloc就行不通”,因为我指的是内存中没有分配空间的点。