【发布时间】: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->bytes,num->len); 更改为 realloc(num->bytes+1,num->len-1); 会将输出/行为更改为:
10361264,0,0,2
然后崩溃。可能我根本不懂指针,但我目前的理解是它们本质上是存储另一个值的地址。在这种情况下,为什么提供pointer+1 不指向存储在比指针高一级的地址中的值,或者换句话说,什么将充当该指针指向的数组的第一个元素。我想要做的是将num.bytes 指向的数组从第一个元素开始复制到内存中的新地址,但很明显,由于某种原因它失败了。
【问题讨论】: