错误代码:
#include <iostream> int main() { int* ptr = (int*)malloc(4); int i = 1111; ptr = &i; std::cout << *ptr << std::endl; free(ptr); return 0; }
在最后释放ptr指针时会出现下面错误,
原因是我们将i的指针地址赋给了ptr,也就是我们在错误的释放i的地址而不是原始的ptr地址。
正确代码:
#include <iostream> int main() { int* ptr = (int*)malloc(4); int i = 1111; int* p = &i; memcpy(ptr, &i, 4); std::cout << *ptr << std::endl; free(ptr); return 0; }
使用memcpy函数将i的内存复制给ptr,这样ptr的地址不会改变。并且最终ptr指针可以得到很好的释放。
拓展: 使用int *p = &i; 是为了查看i地址的字节,如下所示
57 04 00 00 是1111的十六进制值,二进制是0000 0100 0101 0111(04 57), 因为字节分配在内存上是倒序的,所以我们看到的57 04
还需要注意的是,malloc的时候要分配4个字节,因为int是4字节大小,如果只分配一个字节,那我们只能获得57(0101 0111)了、一个字节是8bit