c - 如何转换指针(使其变大)

标签 c

我的程序/进程异常退出?我怀疑以下代码有问题:

有两个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("....");
  1. Cast var2 可能会导致访问非法内存从而导致段错误?我认为它可能会弄乱内存中 var2 之后的数据,但不能造成段错误?我发现我的程序在这里退出,因为下面的 printf() 没有打印任何东西。

  2. Cast 会破坏内存中 var2 之后的数据,即使它只是被读取(var2 只是 memcpy() 的来源。

  3. 如果我像 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/

相关文章:

在非 IEEE 浮点实现中更改尾数的宽度

c - 将链表附加到另一个链表的末尾

c - gets() 只读取一个换行符时保存了什么

c - FFMPEG 滤镜图 'warning, too many B-frames in a row'

c - 尝试从 C 数组中删除元素时出现意外结果

c - 为什么 GCC 在使用 WinAPI : COLORREF/RGB? 时不报告任何错误或警告

C Shell 执行命令

c - 如何将文件中的逗号分隔行拆分为 C 中的变量?

c - 将 ruby​​ 数组值传递到 C 数组

不能使用 sa_sigaction - "sigaction doens' t 有一个字段 sa_sigaction"