C 指针通过堆栈传递时变为null

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)

我对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)
{
    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