malloc出错?union在内存中的表现形式
#include stdio.h
#define BUFSIZER① ⑤①②
#define BUFSIZER② ((BUFSIZER①/②))
main()
{
tchar *buf①R①;
tchar *buf②R①;
tchar *buf②R②;
tchar *buf③R②;
tbuf①R① = (char *)malloc(BUFSIZER①);
tbuf②R① = (char *)malloc(BUFSIZER①);
tbuf②R① = NULL;
tbuf②R② = (char *)malloc(BUFSIZER①);
}
不清楚为什么①运行到这段就出错,“buf②R② = (char *)malloc(BUFSIZER①);”
我的同学机子上没有出错?
我的机子是Win①⓪ ⑥④位;

复现题主问题的关键是使用C编译器以及目标为⑥④位程序。
其实这个问题通过仔细观察warning就可以找到原因。
如@Belleve 所说,malloc函数的声明可以通过包含stdlib.h找到。
如果未包含stdlib.h文件malloc实际上是未声明的函数。
在C⑨⑨之前未声明函数默认返回值类型为int。如果链接到了不兼容类型的函数,运行时是未定义行为。
warning中提到将int转换为char*,这①步VC的实现是带符号扩展(cdqe)。
问题就出在这①步。实际的malloc函数返回的是①个⑥④位指针,但编译器认为它是①个③②位的int,在转成char*时做了带符号扩展。
比如说malloc返回了⓪x⓪⓪⓪⓪⓪②⑧CC⑦⑧⑥F⑦C⓪ · 经过CDQE就变成了⓪xFFFFFFFFC⑦⑧⑥F⑦C⓪。
这样就出现了①个野指针,不管是使用还是free都会出C⓪⓪⓪⓪⓪⓪⑤。
解决方法就是包含stdlib.h,引入正确的malloc函数声明。
找了些资料,来回答自己的问题:
union这个token主要是给编译器用,不会怎么在运行时体现。union->x并不代表这个union在内存中有①个x的成员,而是告诉编译器将union以x的类型来访问。所以其实union和union->x是在访问同①个内存地址,只不过因x的类型不同,编译器对内存的解读不同。
内存占用为最大那个
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息
