我的程序/进程异常退出?我怀疑以下代码有问题:
有两个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))那样改变它会发生什么?
谢谢。
最佳答案
首先:使用memcpy
时,您不需要将&var2
转换为TYPE1*
。 memcpy
需要 void*
,任何指针类型都可以转换为 void*
。
这里的问题是,当 TYPE1
大于 TYPE2
并且您正在将数据从 var2
复制到 var1
使用sizeof(TYPE1)
作为大小,memcpy 最终会读取超出var2
占用的内存。因此,您正在访问不允许访问的内存。因此,段错误是您所能达到的最佳结果,因为该错误也可能在相当长的一段时间内没有被注意到,直到它真正造成问题(未定义的行为是这里的关键词)。
当您仅将 sizeof(TYPE2)
个字节从 var2
复制到 var1
时,您在内存访问方面没问题(只要TYPE1
确实比 TYPE2
大)。
关于c - 如何转换指针(使其变大),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9885328/