铸造时检测到堆栈粉碎

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 对象中,应该逐个成员地完成。