我的程序/过程异常地退出?我怀疑以下代码有问题:
有两种类型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*
转换为memcpy
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/