c++中大于零的指针,这意味着什么
A pointer greater than zero in c++, what does mean?
我在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)
是什么意思。它是一个大于零的指针。我认为在一个普通的编译器中,没有等于零的地址。或者这还有其他含义吗?否则,这句话似乎毫无意义。谢谢
我认为这是一个错误,原作者的意思是:
if(marginalProbability[0]>0)
printf("larger");
else
printf("smaller");
如果他们已经无条件地调用了memset()
,我不明白他们为什么要测试marginalProbability
是否有效。此外,单词较大和较小的使用表示值的比较,而不是指针。
NULL
指针被视为零。话虽如此,这段代码可能只是错误的,因为比较是肯定的(因为如果指针为NULL,memset就会崩溃)。
在这种情况下,0
被解释为空指针常量。
您可以比较两个指针,但结果是未指定的,除非它们指向同一数组的两个元素;从而使得代码格式良好但毫无意义。
我怀疑代码应该将概率值*marginalProbability
或marginalProbability[i]
与零进行比较。如果它是为了检查分配是否成功,那么它是错误的,原因有三:
- 它将不得不使用
!=
,因为>
的结果是未指定的 - 则必须在CCD_ 10之前完成
- 只有在分配使用CCD_ 11的情况下才是必要的;普通
new
在失败时抛出std::bad_alloc
值为零的指针是空指针。一个指向任何东西的指针。检查它是否为零(p!=0更常见于p>0,尽管p!=nullptr是最正确的)意味着它不是null。
您列出的代码也是错误的。如果新操作失败,它将不会返回空指针,而是抛出一个不会被捕获的异常。
这就是它应该有的样子。
try{
std::vector<double> marginalProbability (10, 0.0);
}catch(const std::bad_alloc& e){
std::cerr << "no memory" << std::endl;
}
有一些指针是0
。它们显式地是"null"指针,不指向当前有效的对象。然而,在这种情况下使用<
/>
是没有意义的——例如,没有1
指针这样的东西。
另外,这是C代码假装成C++。
正如其他人已经提到的,这是一个bug。这个bug的一个更微妙的变体可以在这里找到:指针和整数之间的警告比较。
现代gcc(13.1)在以下方面出错:
:7:9:错误:ISO C++禁止在指针和之间进行比较整数[-fpermission]7 |如果(y>5){|~^~编译器返回:1
较旧版本的gcc可能需要-Wextra
:
选项-Wextra还打印以下内容的警告消息案例:
A pointer is compared against integer zero with <, <=, >, or >=.
- 这行代码在C++类中意味着什么
- 这对"With a stackless coroutine, only the top-level routine may be suspended."意味着什么
- @CPPFLAGS@在 Makefile.in 中意味着什么?
- 生成文件"relink"意味着什么?
- 从二进制流中读取时,将双精度变量的地址转换为 char* 意味着什么?
- 在这种情况下,"typename..."意味着什么?
- "in-situ without memory allocation" 字符串的愚蠢实现意味着什么?
- 使用typedef有什么用,它意味着什么
- GCC 的 -Wpsabi 选项究竟有什么作用?压制它意味着什么?
- 这在C++ "It does not own the underlying data, and so is cheap to copy or assign"中意味着什么
- 由于某种原因,我的代码中出现了 [json.exception.type_error.302]。我知道错误意味着什么,但我不知道哪里有故障
- 调用堆栈显示 SIGBUS,这意味着什么
- C++标准在[basic.scope.hiding]中"same scope"到底意味着什么?
- 评估对象的创建意味着什么?
- 当我们在 C++ 中说"initialize the object"时,它实际上意味着什么?
- C++这种结构"InterceptionKeyStroke &kstroke = * (InterceptionKeyStroke *) &stroke"意味着什么?
- 该语法在C 中意味着什么
- 链接标志对静态库意味着什么
- 由mpglib输出的"hip: Can't rewind stream by 74 bits"到底意味着什么?
- 这在 C# 中意味着什么以及如何使用它