【发布时间】:2012-03-27 07:46:28
【问题描述】:
我的程序/进程异常退出?我怀疑以下代码有问题:
有两个typedef TYPE1,TYPE2。 (TYPE1的尺寸比TYPE2大)
TYPE1 var1;
TYPE2 var2;
....
....var2 has been assigned.
....
memset(&var1, 0, sizeof(var1));
memcpy(&var1, (TYPE1 *)&var2, sizeof(TYPE1));
printf("....");
Cast var2 可能会导致访问非法内存从而导致分段错误?我认为它可能会弄乱内存中 var2 之后的数据,但不能造成分段错误?我在这里找到了我的程序退出,因为下面的 printf() 没有打印任何东西。
Cast 会破坏内存中 var2 之后的数据,即使它只是被读取(var2 只是 memcpy() 的来源。
如果我像 memcpy(&var1, (TYPE1 *)&var2, sizeof(TYPE2));
这样更改它会发生什么
谢谢。
【问题讨论】:
-
printf的输出通常被缓冲。在崩溃之前,您的代码可能已经超过了printf。您可能想要使用调试器或至少在此处发布更多代码。 -
你不需要演员表。 C 语言中的强制转换几乎总是错误的,并且表明需要重构。除此之外,在
memcpy()调用中,您试图在对象结束后通过&var2访问数据(sizeof var1 > sizeof var2)。 -
@pmg - 我可以限定“C 中的强制转换几乎总是错误的”吗? “将指针转换为 void 指针几乎总是错误的,因为它从来没有必要”(说实话,在将任何指针分配给 void * 需要在现代 C 中进行转换时,我想不出任何情况。所以也许我正在wish-washy),我不希望人们认为“...(unsigned int)c”或“foo((double)i”属于同一类错误。
-
@gbulmer:在我的脑海中,唯一需要强制转换的地方是在将参数传递给可变参数函数以及使用
<ctype.h>中声明的函数时。大多数其他类型转换可以通过编译器的隐式转换更好地完成。
标签: c