我正在进行一个视频处理项目,我在分配块地址以发送到dct函数时感到非常震惊。
以下行没有将正确的赋值地址作为指向右侧的变量。
temp = (unsigned short *)((unsigned short *)(p_vqi->luma + j) + l);
所以temp
不包含p_vqi->luma
变量指向的正确地址,其中j
和i
每步增加16次,最多144个和176分别。
答案 0 :(得分:2)
经常让人们使用指针数学的东西是它一次不添加一个字节,它一次添加一个sizeof(thing pointed to)
,所以你将跳过j
lumas,无论多大,那么i
无符号短裤,无论你的架构多么大。通常,使用固定格式直接以字节为单位时,它更容易,更便携,例如:
uint8_t* temp = (uint8_t*)p_vqi->luma;
temp += j*16 + i;
答案 1 :(得分: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。
答案 2 :(得分:1)
指针的加法(& substraction)具有与标准算术运算不同的行为。这些操作将根据它们所代表的数据大小进行分解。
让我们举一个例子,考虑到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