【问题标题】:Strange behavior of memcpy/memmovememcpy/memmove 的奇怪行为
【发布时间】:2011-04-17 18:01:48
【问题描述】:

我的问题是 memcpy/memmove 更改了 struct FOO foo 的指针,它既不是函数的源代码也不是函数的目标地址。以下是 gdb 输出:

memmove(y,y_temp,size_y);之前:

(gdb) p y
$38 = 0xbff7a2e0
(gdb) p y_temp
$39 = (float *) 0x815ea20
(gdb) p foo
$40 = (FOO *) 0x81d4e90

之后:

(gdb) p y_temp
$41 = (float *) 0x343434
(gdb) p y 
$42 = 0x343434 
(gdb) p foo
$43 = (FOO *) 0x343434

以下是变量的定义:

FOO *foo;
float y[nsamples];
float size_y = nsamples*sizeof(y);
float* y_temp = (float*) malloc(size_y);

我知道,这不是 memcpy/move 的错误,所以我寻找提示,我这边的编程错误可能导致它。

谢谢

【问题讨论】:

    标签: c memory-management memcpy memmove


    【解决方案1】:
    size_t size_y = sizeof(y);
    

    sizeof(y) 已经给出了整个数组的大小,类型应该是size_t

    如果这样做,yy_temp 指向的内存大小将相同。你还应该确保你朝着正确的方向前进。现在,y 是目的地。此外,如果源和目标不重叠(此处不会重叠),请使用memcpy

    【讨论】:

      【解决方案2】:
      float y[nsamples];
      /* let's say a float is 4 bytes and nsamples is 13 */
      float size_y = nsamples*sizeof(y);
      /* size_y is now 13 * 52 == 676 */
      

      然后你做

      memmove(y, y_temp, size_y);
      

      但是y 没有足够的空间容纳所有size_y 字节!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-23
        • 1970-01-01
        • 1970-01-01
        • 2015-04-21
        • 1970-01-01
        • 2016-06-09
        相关资源
        最近更新 更多