我担心您的代码中会出现一些严重缺乏理解的指针。让我逐行剖析,以明确问题出在哪里。
假设类型声明如上,我对语句进行了编号以便于引用。
int main()
{
int *temp, tmp;
abc* ab;
/* 1 */ tmp = 5;
/* 2 */ temp = &tmp;
/* 3 */ ab = (abc*)malloc(sizeof(abc));
/* 4 */ xyz *x = (xyz*)malloc(sizeof(xyz));
/* 5 */ def *de = (def*)malloc(sizeof(def));
/* 6 */ x = (xyz*)temp;
/* 7 */ ab = (abc*)x;
return 0;
}
首先:您永远不会清理在 3、4 和 5 中分配的内存。即使对于一个简单的测试程序,您也应该始终注意这样的事情。
您的第一个问题是第 6 行,您盲目地将指向 int 类型的对象(内存中的 4 个字节)的指针转换为指向 xyz 类型的结构的指针(内存中的 4 或 8 个字节,不同类型)。你在这里做的是一种复杂的写法x = (xyz*)&tmp;
。
这样的行为会导致以下严重问题:
- 您刚刚在第 4 行分配了内存。现在您用指向堆栈变量的指针覆盖此指针。因此,您不能再释放分配的内存 ==> 内存泄漏
- 您新分配的指向堆栈变量的指针在退出范围后变得无效,并可能导致未定义的行为。
- 由于元素可能的大小不匹配,任何在第 6 行之后对 x 元素的写入尝试都可能导致堆栈损坏(因此导致未定义的行为)。
到第 7 行,你又遇到了同样的问题,甚至更糟。估计的 sizeof(abc) 可能是 12 个字节。在此行之后访问 abc 的任何元素都可能再次导致堆栈损坏。
我仍然不明白你真正在寻找什么,但如果你“必须”通过指针初始化结构元素,有几种方法:
如果结构已知,您可以这样做: abc * ab = malloc(sizeof(abc));
if (ab != NULL) {
ab->c = 5;
// -- do other stuff
free(ab); ab = NULL;
}
如果你需要一个指向元素'c'的指针,你可以这样做:
int * c_ptr = NULL;
abc * ab = malloc(sizeof(abc));
if (ab != NULL) {
c_ptr = &(ab->c);
*c_ptr = 5;
//-- do other stuff
free(ab); ab = NULL;
}