首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >malloc的功能(正确使用malloc)

malloc的功能(正确使用malloc)
EN

Stack Overflow用户
提问于 2017-06-17 12:02:52
回答 3查看 363关注 0票数 0

所以我是新来的,抱歉,如果这听起来像个愚蠢的问题

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

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

代码语言:javascript
复制
char *i;
i = malloc(sizeof(char)*4); 
*i = 65;
*(i+1) = 66;
*(i+2) = 67;
*(i+3) = '\0';

我不明白的是,为什么我要把malloc放在那里?教授告诉我们,没有malloc程序不会运行,但是当我尝试不使用malloc运行它时,程序运行得很好。那么malloc的功能是什么呢?我用得对吗?

任何帮助和解释都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-17 12:09:01

教授告诉我们,没有malloc程序就不能运行。

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

原因是

代码语言:javascript
复制
char *i;

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

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

所有这些,当然,该程序可以工作,没有malloc()。你可以直接写

代码语言:javascript
复制
char i[4];

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

最后一点注意:sizeof(char)被定义为1,所以您可以只编写i = malloc(4);

票数 4
EN

Stack Overflow用户

发布于 2017-06-17 12:08:23

不幸的是,“运行良好”标准不能证明C程序。大量运行到完成的C程序都有未定义的行为,这些行为不会在您的特定平台上显示出来。

您需要特殊的工具来查看此错误。例如,您可以通过缬磨运行代码,并看到它访问未初始化的指针。

至于malloc,您不必在代码中使用动态缓冲区。在自动内存中分配缓冲区是非常好的,如下所示:

代码语言:javascript
复制
char buf[4], *i = buf;
票数 3
EN

Stack Overflow用户

发布于 2017-06-17 17:28:15

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

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
  char *i;
  strcpy(i, "hello");
  printf("%s\n", i);
  return (0);
}

输出:分段故障(弃核)

代码语言:javascript
复制
#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它就不能工作”,因为我指向内存中一个还没有分配空间的点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44604395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档