我的程序/过程异常地退出?我怀疑以下代码有问题:
有两种类型def TYPE1,TYPE2(类型1的大小大于类型2)

TYPE1 var1;
TYPE2 var2;
....
....var2 has been assigned.
....
memset(&var1, 0, sizeof(var1));
memcpy(&var1, (TYPE1 *)&var2, sizeof(TYPE1));
printf("....");

Cast var2可能导致访问非法内存,从而导致分段错误我想它可能会弄乱内存中var2之后的数据,但不能造成分段错误我发现我的程序在这里退出,因为下面的Prtff()没有打印任何东西。
Cast将破坏内存中var2之后的数据,即使它是只读的(var2只是memcpy()的源)。
如果我像memcpy(&var1,(TYPE1*)&var2,sizeof(TYPE2))那样更改它会怎么样;
谢谢。

最佳答案

所以首先:在使用&var2时,不需要将TYPE1*转换为memcpymemcpy需要void*,任何指针类型都可以转换为void*
这里的问题是,当TYPE1大于TYPE2时,并且您使用var2作为大小将数据从var1复制到sizeof(TYPE1)时,memcpy最终将从var2占用的内存之外读取因此,您正在访问不允许访问的内存因此,分割错误是最好的,因为这个错误可能在相当长的一段时间内都没有被注意到,直到它真的可能引起麻烦为止(未定义的行为是这里的关键短语)。
当您只将sizeof(TYPE2)字节从var2复制到var1时,您在内存访问方面是可以的(只要TYPE1确实大于TYPE2)。

关于c - 如何转换指针(使其变大),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9885328/

10-12 17:29