C 指针通过堆栈传递时变为null
我对OpenCV的一个函数有一个非常奇怪(不可能)的问题-指针被传递到C 指针通过堆栈传递时变为null,c,opencv,c-api,C,Opencv,C Api,我对OpenCV的一个函数有一个非常奇怪(不可能)的问题-指针被传递到cvGetSize,内部cvGetSize变为NULL。我在CvGetSize中检查了它们,它实际上变成了NULL。没有解引用,只需转换 这怎么可能呢?(lang:C,编译器MSVC 2012) 我的代码: #include <opencv2/core/core_c.h> #include <opencv2/highgui/highgui_c.h> void Test(IplImage * img)
cvGetSize
,内部cvGetSize
变为NULL
。我在CvGetSize
中检查了它们,它实际上变成了NULL
。没有解引用,只需转换
这怎么可能呢?(lang: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
的指针输出
输出:
img in test = 000000B2F5536F80
img in cvGetSize = 000007F9058A8670
更新:
如果我将此示例设置为CPP文件,则一切正常。实际上,传递的指针未被视为常量,请比较:
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
intx=1;
int y=2;
常量int*p=&x;
无法显示一个小片段如何调用此函数,请编辑您的问题!尝试cvGetSize(静态_cast(img))代码>CvArr*
是void*
的类型定义。它是一个“C”,没有静态类型转换。我使用“C”cast-(CvArr*),但它是相同的。避开它,它只是指针!没有数学,没有其他的东西,只是把它抛向虚空。常数在这里没有意义。你是什么意思?我的意思是,从colpiler的观点来看,指针无效是正确的,因为函数不能保证f1中的指针constness\u arr是指向const对象的指针。cvGetSize接收相同类型的指向const对象的指针,因此cvGetSize保证不会更改_arr内容。为什么指针应该变为null?在这种情况下,指针内容(即*ptr)不会更改,指针本身会更改。指针本身(地址)在cvGetSize内部(或调用堆栈中的某个位置)不会更改。我从未见过由于cv限定符而自动取消指针。
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