【问题标题】:Pointer becomes null when passed by stack指针通过堆栈传递时变为空
【发布时间】:2014-05-14 12:54:17
【问题描述】:

OpenCV 的一个函数有一个非常奇怪(相当不可能)的问题 - 传递给 cvGetSize 的指针,在 cvGetSize 内部变为 NULL。我在CvGetSize 中检查了它们,它真的变成了NULL。没有取消引用,只是强制转换。

这怎么可能? (语言:C,编译器 MSVC 2012)

我的代码:

#include <opencv2/core/core_c.h>
#include <opencv2/highgui/highgui_c.h>

void Test(IplImage * img)
{
    CvArr * arr = (CvArr*)(img);
    printf("img in test = %p\n", (CvArr*)img);
    cvGetSize(arr);
}

int main(int argc, char *argv[])
{
    IplImage * img;
    img = cvLoadImage("D:\\fusion.jpeg",CV_LOAD_IMAGE_COLOR);
    Test(img);
    return 0;
}

cvGetSize的签名:

CV_IMPL CvSize cvGetSize( const CvArr* arr )

我还添加了指向cvGetSize的指针输出。

输出:

img in test = 000000B2F5536F80
img in cvGetSize = 000007F9058A8670

更新: 如果我将此示例设为 CPP 文件,则一切正常。

【问题讨论】:

  • 显示一个小sn-p这个函数是如何调用的,请编辑你的问题!
  • 试试cvGetSize(static_cast&lt;CvArr*&gt;(img));CvArr*void* 的类型定义。
  • 这是一个“C”,没有static_cast。我使用 "C" cast - (CvArr*) 但它是一样的。
  • c-api 已死。避免它。
  • 只是指针!没有数学,没有其他东西,只是强制转换为 void*。

标签: c opencv c-api


【解决方案1】:

其实传递的指针并没有被当成const,比较一下:

const CvArr * arr ;

代表一个指向常量的指针

CvArr * const arr ;

代表常量指针

你可以这样检查:

int x = 1 ;
int y = 2 ;
const int *p = &x ;
cout << *p ; // 1
p = &y ;
cout << *p << x << y ; // 212
const int * const pc = &x ;
pc = &y ; // Compilation Error

所以它看起来像一个有效的行为

【讨论】:

  • Const 在这里没有意义。
  • 什么意思?我的意思是,从 colpiler 的角度来看,指针无效是正确的,因为函数不保证指针常量
  • _arr in f1 是一个指向 const 对象的指针。 cvGetSize 接收相同的类型 - 指向 const 对象的指针,因此 cvGetSize 保证 _arr 内容不会被更改。为什么指针应该为空?
  • 在这种情况下,指针内容(即 *ptr)不会改变,指针本身会改变。
  • 指针本身(地址)在 cvGetSize(或调用堆栈中的某处)内未更改。我从未见过由于 cv-qualifiers 导致的指针自动无效。
猜你喜欢
  • 2018-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
  • 2021-04-08
  • 2010-10-13
相关资源
最近更新 更多