所以我是新来的,抱歉,如果这听起来像个愚蠢的问题
我试图理解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的功能是什么呢?我用得对吗?
任何帮助和解释都将不胜感激。
发布于 2017-06-17 12:09:01
教授告诉我们,没有malloc程序就不能运行。
这不是完全正确的,正确的措辞应该是:“如果没有malloc(),程序的行为是未定义的”。
原因是
char *i;只是声明了一个指向char的指针,但是没有初始化--这个指针指向某个不确定的位置。您可能只是幸运的是,写值到这个“随机”的位置工作,不会导致崩溃。我个人认为这是不吉利的,因为这在你的程序中隐藏了一个bug。未定义的行为只是意味着任何事情都可能发生,包括“正确”的程序执行。
malloc()将动态请求一些可用内存并返回指向该内存的指针,因此在malloc()之后,您知道i指向您可以使用的4个字节的内存。如果malloc()由于某种原因而失败(没有可用内存),它将返回NULL --您的程序应该在写入*i之前对其进行测试。
所有这些,当然,该程序可以工作,没有malloc()。你可以直接写
char i[4];i是一个局部变量,有4个字符的空间。
最后一点注意:sizeof(char)被定义为1,所以您可以只编写i = malloc(4);。
发布于 2017-06-17 12:08:23
不幸的是,“运行良好”标准不能证明C程序。大量运行到完成的C程序都有未定义的行为,这些行为不会在您的特定平台上显示出来。
您需要特殊的工具来查看此错误。例如,您可以通过缬磨运行代码,并看到它访问未初始化的指针。
至于malloc,您不必在代码中使用动态缓冲区。在自动内存中分配缓冲区是非常好的,如下所示:
char buf[4], *i = buf;发布于 2017-06-17 17:28:15
你必须为内存分配空间。在下面的示例中,我没有为我分配内存,这导致了一个分段错误(您正在尝试访问无法访问的内存)。
#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它就不能工作”,因为我指向内存中一个还没有分配空间的点。
https://stackoverflow.com/questions/44604395
复制相似问题