所以我对此很新,抱歉,这听起来像一个愚蠢的问题
我试图了解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的功能是什么呢? 我甚至正在使用它吗?
任何帮助和解释都会非常感激
答案 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就行不通”,因为我指的是内存中没有分配空间的点。