我在学习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和指针?我对星号这个东西感到困惑,就像什么时候使用星号等.在我学习这个东西之前我不会休息!谢谢!
您正在调用未定义的行为,因为您正在编写(或尝试写入)超出已分配内存的范围.
其他挑剔:
strcpy()
,所以您正在复制7个字节,而不是您在问题中声明的6个字节.strcpy()
是有缺陷的 - 你传递的是一个char
而不是指针char
作为第一个参数.-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()
另请注意,如果您复制的字符串更长(比如字母表更长),特别是如果您尝试分配内存,或者在第一个字符串结束后涂写其他内存块,那么您更有可能看你的代码崩溃了.
未定义的行为是无条件的.什么事情都可能发生.诊断它不需要任何系统.躲开它!
归档时间: |
|
查看次数: |
584 次 |
最近记录: |