C语言——Malloc无限空间?

标签 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

}

我预计会出现错误,因为我提供给 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/

相关文章:

c - 需要使用 malloc 进行家庭作业,但输出始终显示 10.00

c++ - 如果我对 float 变量使用 malloc 和 calloc 并将其分配给 int 那么其余 2 个字节会发生什么?

c - 为什么在任意内存位置设置值不起作用?

C 函数调用和参数跟踪 - 测试用例和模拟生成

c - 计算距离平方的最快方法

c - int x=259中p指向什么; char *p = (char*)&x;?

c++ - 以下函数的时间复杂度应该是多少?

c - 有没有办法找出在 c 中使用 malloc 时可用的最大字节数?

c - malloc() 是否在循环中重用相同的内存地址?

Xcode Guard Malloc 和设备调试 : 'libgmalloc.dylib' image not found