以下に、問題を示す簡単なCプログラムがあります。ポインタを使用してrealloc
にコールしようとするとうまくいきますが、ポインタにオフセットを追加しようとすると(つまり、配列の後の要素から開始する)、失敗します。ポインタにオフセットがあると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+1,num->len-1);
にrealloc(num->bytes,num->len);
を変更すると、この出力/動作を変更し:次いで
10361264,0,0,2
やクラッシュ。私はポインタを全く理解していないかもしれませんが、私の現在の理解は、それらが基本的に別の値が格納されているアドレスであるということです。この場合、なぜpointer+1
がポインタよりも1つ高いアドレスに格納されている値を指していないか、言い換えれば、そのポインタが指す配列の最初の要素として機能するのはなぜですか?私がしようとしているのは、num.bytes
が指し示す配列を最初の要素からメモリ内の新しいアドレスにコピーすることですが、明らかに何らかの理由で失敗しています。
右。そして、明らかに私が望むことをするために 'memcpy'を使うことができます。 – user2649681
@ user2649681まあ、それ以前でさえ、あなたはUBにぶつかるでしょう。 –
@ user2649681 "明らかに私はmemcpyを使って私が望むことをすることができます" - >疑わしい。しかし、 'memmove()'がうまくいくかもしれません。 – chux