2

我正在做一个视频处理项目,我在分配块地址以发送到 dct 函数时感到震惊。

以下行没有将正确的分配地址作为指向的右手变量。

temp = (unsigned short *)((unsigned short *)(p_vqi->luma + j) + l);

sotemp不包含p_vqi->luma变量指向的正确地址,其中ji将在每一步中递增 16 次,最大值分别为 144 和 176。

4

3 回答 3

2

经常让人们使用指针数学的事情是,它不是一次添加一个字节,而是一次添加一个字节sizeof(thing pointed to),因此您将跳过jlumas,无论它有多大,然后是i无符号短裤,无论多大那是在你的架构上。通常,在使用固定格式以直接以字节为单位工作时,它更容易且更便携,例如:

uint8_t* temp = (uint8_t*)p_vqi->luma;
temp += j*16 + i;
于 2011-05-11T07:07:59.593 回答
2

请注意,向指针添加数字会使指针增加该元素数,而不是字节数。换句话说,您首先添加j * sizeof(the type of the luma entries)到指针,然后i * sizeof(unsigned short)对于大多数实现来说是两个字节。

但是,如果你想添加 j + i 字节,你应该做这样的事情。

temp = (unsigned short *)((intptr_t)p_vqi->luma + j + i);

这应该给你一个指向一个无符号短的指针,它比原始的 i + j 字节高。intptr_t 类型是 C99,如果您需要与旧编译器兼容,请改用 unsigned long。

于 2011-05-11T07:09:36.113 回答
1

指针的加法(和减法)具有与标准算术运算不同的行为。这些操作将根据它们所代表的数据大小进行分解。

举个例子,考虑到 char 是一个字节,short 是两个字节,一个 int 是 4 个字节长度:

char * p1;
shot * p2;
int * p3;

p1 += 1; // p1 will be incremented by 1
p2 += 1; // p2 will be incremented by 2
p3 += 1; // p3 will be incremented by 4
于 2011-05-11T07:10:13.053 回答