C++ でのポインター演算の動作に混乱しています。配列があり、現在の要素から N 要素を進めたいと考えています。C++ ではポインタは BYTES のメモリ アドレスであるため、コードがnewaddr = curaddr + N * sizeof(mytype)
. ただし、エラーが発生しました。newaddr = curaddr + N
後で、すべてが正しく機能することがわかりました。なんでそうなの?address + N * sizeof ではなく、本当に address + N であるべきですか?
私が気づいたコードの一部 (すべてのメモリが 1 つのチャンクとして割り当てられた 2D 配列):
// creating pointers to the beginning of each line
if((Content = (int **)malloc(_Height * sizeof(int *))) != NULL)
{
// allocating a single memory chunk for the whole array
if((Content[0] = (int *)malloc(_Width * _Height * sizeof(int))) != NULL)
{
// setting up line pointers' values
int * LineAddress = Content[0];
int Step = _Width * sizeof(int); // <-- this gives errors, just "_Width" is ok
for(int i=0; i<_Height; ++i)
{
Content[i] = LineAddress; // faster than
LineAddress += Step; // Content[i] = Content[0] + i * Step;
}
// everything went ok, setting Width and Height values now
Width = _Width;
Height = _Height;
// success
return 1;
}
else
{
// insufficient memory available
// need to delete line pointers
free(Content);
return 0;
}
}
else
{
// insufficient memory available
return 0;
}