铸造时检测到堆栈粉碎
Stack smashing detected on casting
我有以下代码:
#include <stdio.h>
typedef struct {
int a, b, c, d, e, f;
}
type1;
typedef struct {
int a, b, c;
}
type2;
type1 RTE = {
1,
2,
3,
4,
5,
6
};
void copy(type1 * arg) {
* arg = RTE;
}
int main() {
// Write C code here
printf("%d\n", RTE.c);
type2 local;
copy((type1 * ) &local);
printf("%d", local.c);
return 0;
}
当我 运行 它时,我收到堆栈粉碎检测错误。我怀疑这是因为演员阵容,但我不明白为什么。如果有人能解释我,我将不胜感激。
结构 type1
需要 type2
所需内存的两倍 space,但您只在语句 [=13] 中分配了 type2
的变量=].这将在堆栈上分配,因为它是一个局部变量。当指针在语句 copy((type1 * ) &local);
中强制转换,然后在函数 copy
内的语句 * arg = RTE;
中取消引用时,程序会将 RTE
的较大内容复制到 RTE
的较小分配内存中=18=] 基本上溢出来了。如果堆栈从下往上填满,这基本上会破坏堆栈,导致程序 returns.
失败。
作为一般做法,在两种不同类型的指针之间进行转换并不是一个好主意。此外,对于 ANSI C,编译器可能会确定如何相对于 struct
的基地址排列 struct
成员,因此假定 struct
的任何特定成员将是不安全的转移任何其他特定成员,无论类型和定义顺序如何。
如果要将 type1
对象的内容复制到 type2
对象中,应该逐个成员地完成。
我有以下代码:
#include <stdio.h>
typedef struct {
int a, b, c, d, e, f;
}
type1;
typedef struct {
int a, b, c;
}
type2;
type1 RTE = {
1,
2,
3,
4,
5,
6
};
void copy(type1 * arg) {
* arg = RTE;
}
int main() {
// Write C code here
printf("%d\n", RTE.c);
type2 local;
copy((type1 * ) &local);
printf("%d", local.c);
return 0;
}
当我 运行 它时,我收到堆栈粉碎检测错误。我怀疑这是因为演员阵容,但我不明白为什么。如果有人能解释我,我将不胜感激。
结构 type1
需要 type2
所需内存的两倍 space,但您只在语句 [=13] 中分配了 type2
的变量=].这将在堆栈上分配,因为它是一个局部变量。当指针在语句 copy((type1 * ) &local);
中强制转换,然后在函数 copy
内的语句 * arg = RTE;
中取消引用时,程序会将 RTE
的较大内容复制到 RTE
的较小分配内存中=18=] 基本上溢出来了。如果堆栈从下往上填满,这基本上会破坏堆栈,导致程序 returns.
作为一般做法,在两种不同类型的指针之间进行转换并不是一个好主意。此外,对于 ANSI C,编译器可能会确定如何相对于 struct
的基地址排列 struct
成员,因此假定 struct
的任何特定成员将是不安全的转移任何其他特定成员,无论类型和定义顺序如何。
如果要将 type1
对象的内容复制到 type2
对象中,应该逐个成员地完成。