C语言 - Malloc无限空间?

dpp*_*dpp 0 c malloc

我在学习C语言的malloc和指针时遇到困难:

到目前为止我学到了什么:

  • 指针是内存地址指针.

  • malloc() 分配内存位置并返回内存地址.

我正在尝试创建一个测试malloc和指针的程序,这就是我所拥有的:

#include<stdio.h>

main()
{
char *x;
x = malloc(sizeof(char) * 5);

strcpy(*x, "123456");
printf("%s",*x); //Prints 123456

}
Run Code Online (Sandbox Code Playgroud)

我期待一个错误,因为我提供的大小malloc是5,我把6个字符(123456)放到我的指针所指向的内存位置.这里发生了什么?请帮我.

更新

在哪里学习malloc和指针?我对星号这个东西感到困惑,就像什么时候使用星号等.在我学习这个东西之前我不会休息!谢谢!

Jon*_*ler 5

您正在调用未定义的行为,因为您正在编写(或尝试写入)超出已分配内存的范围.

其他挑剔:

  • 因为您正在使用strcpy(),所以您正在复制7个字节,而不是您在问题中声明的6个字节.
  • 你的调用strcpy()是有缺陷的 - 你传递的是一个char而不是指针char作为第一个参数.
  • 如果您的编译器没有抱怨,那么您没有使用足够的警告选项.如果您正在使用GCC,则至少需要在-Wall编译器命令行中使用.
  • 你需要包括<stdlib.h>for malloc()<string.h>for strcpy().
  • 您还应该明确指定int main()(或更好int main(void)).
  • 就我个人而言,我已经足够老了,我更喜欢return(0);在最后看到一个明确的main(),即使C99遵循C++ 98并允许你省略它.

你可能运气不好并且暂时调用未定义的行为,但像valgrind这样的工具应该指出你的方式的错误.在实践中,许多实现malloc()分配8个字节的倍数(以及一些16个字节的倍数),并且鉴于您精心地不跨越8字节分配,您实际上可以侥幸逃脱它.但是一个好的调试malloc()或者valgrind会指出你做错了.

请注意,由于free()在返回之前没有分配空间main(),因此(在此上下文中相对无害)会泄漏它.free()另请注意,如果您复制的字符串更长(比如字母表更长),特别是如果您尝试分配内存,或者在第一个字符串结束后涂写其他内存块,那么您更有可能看你的代码崩溃了.

未定义的行为是无条件的.什么事情都可能发生.诊断它不需要任何系统.躲开它!