【问题标题】:realloc crashes when pointer has an offset当指针有偏移时 realloc 崩溃
【发布时间】:2018-05-21 19:59:51
【问题描述】:

我有一个简化的 C 程序来演示这个问题。当我尝试使用指针调用 realloc 时,它工作正常,但如果我尝试向指针添加偏移量(即从数组中的后一个元素开始),它会失败。

# include <stdio.h>
# include <stdlib.h>

struct arbNum{
    unsigned char* bytes;
    long len;
};

void trim(struct arbNum* num){
    printf("%d,%d,%d,%d\n",num->bytes,num->bytes[0],num->bytes[1],num->len);
    unsigned char* nbytes = realloc(num->bytes,num->len);
    printf("Realloc successful.\n");
    num->bytes = nbytes;
}

int main(void){
    struct arbNum p = {calloc(2,1),2};
    trim(&p);
}

作为一个例子,这个输出:

9247152,0,0,2
Realloc successful.

但是,从上面的代码中,将 realloc(num-&gt;bytes,num-&gt;len); 更改为 realloc(num-&gt;bytes+1,num-&gt;len-1); 会将输出/行为更改为:

10361264,0,0,2

然后崩溃。可能我根本不懂指针,但我目前的理解是它们本质上是存储另一个值的地址。在这种情况下,为什么提供pointer+1 不指向存储在比指针高一级的地址中的值,或者换句话说,什么将充当该指针指向的数组的第一个元素。我想要做的是将num.bytes 指向的数组从第一个元素开始复制到内存中的新地址,但很明显,由于某种原因它失败了。

【问题讨论】:

    标签: c arrays pointers realloc


    【解决方案1】:

    不,您只能在 malloc() 或家人之前返回的实际指针上使用 realloc()

    否则就是undefined behavior

    引用C11,第 7.22.3.5 章

    如果ptr 是空指针,则realloc 函数的行为类似于malloc 函数 规定的大小。否则,如果ptr 与内存先前返回的指针不匹配 管理功能,或者如果空间已通过调用 freerealloc 函数,行为未定义。 [....]

    因此,不允许使用指针算法生成一个新地址,将其传递给 realloc() 并期望重新分配部分,这是没有意义的。

    【讨论】:

    • 对。显然我可以使用memcpy 来做我想做的事。
    • @user2649681 好吧,在此之前,你会打 UB。
    • @user2649681 “显然我可以使用 memcpy 来做我想做的事” --> 怀疑。但是memmove() 可能会起作用。
    猜你喜欢
    • 1970-01-01
    • 2018-06-07
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多