我正在做一个视频处理项目,我在分配块地址以发送到 dct 函数时感到震惊。
以下行没有将正确的分配地址作为指向的右手变量。
temp = (unsigned short *)((unsigned short *)(p_vqi->luma + j) + l);
sotemp
不包含p_vqi->luma
变量指向的正确地址,其中j
和i
将在每一步中递增 16 次,最大值分别为 144 和 176。
经常让人们使用指针数学的事情是,它不是一次添加一个字节,而是一次添加一个字节sizeof(thing pointed to)
,因此您将跳过j
lumas,无论它有多大,然后是i
无符号短裤,无论多大那是在你的架构上。通常,在使用固定格式以直接以字节为单位工作时,它更容易且更便携,例如:
uint8_t* temp = (uint8_t*)p_vqi->luma;
temp += j*16 + i;
请注意,向指针添加数字会使指针增加该元素数,而不是字节数。换句话说,您首先添加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。
指针的加法(和减法)具有与标准算术运算不同的行为。这些操作将根据它们所代表的数据大小进行分解。
举个例子,考虑到 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