指针有偏移时realloc崩溃

use*_*681 2 c arrays pointers realloc

我有一个简化的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);
}
Run Code Online (Sandbox Code Playgroud)

例如,这输出:

9247152,0,0,2
Realloc successful.
Run Code Online (Sandbox Code Playgroud)

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

10361264,0,0,2
Run Code Online (Sandbox Code Playgroud)

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

Sou*_*osh 7

不,你只能realloc()在之前由malloc()家人或家人返回的实际指针上.

否则,它是未定义的行为

引用C11,章节§7.22.3.5

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

所以,你不允许使用指针aritmatic去生成一个新的地址,传递给它realloc()并期望部分地重新分配,这是没有意义的.