我在学习 C 语言的 malloc 和指针时遇到困难:
到目前为止我学到了什么:
指针是内存地址指针。
malloc()
分配内存位置并返回内存地址。
我正在尝试创建一个程序来测试 malloc
和指针,这是我所拥有的:
#include<stdio.h>
main()
{
char *x;
x = malloc(sizeof(char) * 5);
strcpy(*x, "123456");
printf("%s",*x); //Prints 123456
}
我预计会出现错误,因为我提供给 malloc
的大小为 5,其中我将 6 个字符 (123456) 放入指针指向的内存位置。这里发生了什么?请帮助我。
更新
哪里学malloc和指针?我被星号的东西弄糊涂了,比如什么时候用星号等等。我不会休息,直到我学会这个东西!谢谢!
最佳答案
您正在调用未定义的行为,因为您正在写入(或试图写入)超出分配的内存范围。
其他问题:
- 因为您正在使用
strcpy()
,您正在复制 7 个字节,而不是您在问题中声称的 6 个字节。 - 您的电话
strcpy()
有缺陷 - 你正在通过char
而不是指向char
的指针作为第一个参数。 - 如果你的编译器没有报错,说明你没有使用足够的警告选项。如果您使用的是 GCC,则至少需要
-Wall
在您的编译器命令行中。 - 您需要同时包含
<stdlib.h>
对于malloc()
和<string.h>
对于strcpy()
. - 您还应该明确指定
int main()
(或者,更好的是int main(void)
)。 - 就我个人而言,我已经够老派了,所以我更喜欢看到明确的
return(0);
在main()
的末尾,即使 C99 遵循 C++98 并允许您省略它。
你可能不走运,暂时调用未定义的行为而侥幸逃脱,但像 valgrind 这样的工具应该指出你方法的错误。在实践中,malloc()
的许多实现分配 8 字节的倍数(有些是 16 字节的倍数),并且假设您小心翼翼地不跨过 8 字节分配,您实际上可能会逃脱它。不过很好调试malloc()
或 valgrind
会指出你做错了。
请注意,因为您不 free()
从 main()
返回之前分配的空间,你(在这种情况下相对无害)泄露了它。另请注意,如果您复制的字符串更长(比如与字母一样长),尤其是如果您尝试 free()
您分配的内存,或在第一个内存块结束后涂鸦后尝试分配其他内存块,那么您更有可能看到您的代码崩溃。
未定义的行为绝对是坏的。什么事情都可能发生。不需要系统来诊断它。避免它!
关于C语言——Malloc无限空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7710035/