我在c ++中遇到了问题。我读了一些代码,但有一个非常有线的指针用法。代码如下:
double* marginalProbability =
new double [10 * sizeof(marginalProbability[0])];
memset( marginalProbability, 0, 10 * sizeof(double) );
//................
//.................
if(marginalProbability>0)
printf("larger");
else
printf("smaller");
我问的问题是if(marginalProbability>0)
是什么意思。它是一个大于零的指针。我认为在普通编译器中,没有地址等于零。或者还有其他含义吗?否则,这条线似乎毫无意义。感谢。
答案 0 :(得分:5)
我认为这是一个错误,原作者的意思是:
if(marginalProbability[0]>0)
printf("larger");
else
printf("smaller");
我不明白为什么如果marginalProbability
已经无条件地调用memset()
,他们会测试{{1}}是否有效。另外,使用单词 greater 和 less 表示值的比较,而不是指针。
答案 1 :(得分:4)
NULL
指针被视为零。话虽这么说,这段代码可能是错的,因为比较保证是真的(因为如果指针为NULL,memset会崩溃)。
答案 2 :(得分:2)
在这种情况下,0
被解释为空指针常量。
你可以比较两个指针,但结果是未指定的,除非它们指向同一个数组的两个元素;所以代码形式良好但没有意义。
我怀疑代码应该将概率值*marginalProbability
或marginalProbability[i]
与零进行比较。如果它打算检查分配是否成功,那么出于三个原因它是错误的:
!=
,因为>
的结果未指定; memset()
之前完成; new (std::nothrow)
时才有必要;普通new
在失败时抛出std::bad_alloc
。答案 3 :(得分:0)
有一些指针0
。它们明确地是指向没有当前有效对象的“空”指针。但是,在这种情况下使用<
/ >
是没有意义的 - 例如,没有1
指针这样的东西。
此外,那个C代码假装是C ++。
答案 4 :(得分:0)
值为零的指针是空指针。什么都没有的指针。检查它不为零(p!= 0更常见,p> 0,尽管p!= nullptr最正确)意味着它不为空。
您列出的代码也是错误的。如果新操作失败,它将不会返回空指针,而是抛出一个不会被捕获的异常。
这应该是它。
try{
std::vector<double> marginalProbability (10, 0.0);
}catch(const std::bad_alloc& e){
std::cerr << "no memory" << std::endl;
}