在其声明的同一语句中使用指针
Using a pointer in the same statement of its declaration
我遇到了一些代码,其中指针在其声明的同一行上使用。这是它的基本SSCCE:
#include "stdafx.h"
#include <iostream>
struct C
{
uint32_t a;
};
int main() {
C* pC = (C*) malloc(sizeof(*pC)); // <---- ???
pC->a = 42;
std::cout << pC << std::endl;
std::cout << pC->a << std::endl;
free(pC);
}
当我尝试用uint32
做类似的事情时(在free()
之前插入(:
uint32_t a = a + pC->a;
std::cout << a << std::endl;
然后,要么不为此语句打印任何内容,要么在调试时将随机值存储在a
中,VS2015 会给我一个运行时警告。执行后的错误级别为 3。我知道这是行不通的。
为什么我可以使用指针?它甚至合法吗?为什么编译器不抱怨这样的语句?声明是否在幕后拆分为多个语句?
uint32_t a = a + pC->a;
会给你不好的结果,因为你在初始化之前使用了a
的值,这是未定义的行为。 有关此内容的更多信息,请参阅为什么"int i = i;"合法?
另一方面,C* pC = (C*) malloc(sizeof(*pC));
在初始化中不使用 pC
的值。 sizeof
,当应用于命名变量时,会为您提供其类型的大小。 这是一个未计算的操作数,这意味着它不会被计算。 所以我们没有使用 *pC
的值,而是我们得到指针指向的大小,C
.
您希望这样做的一个原因是,如果您更改了pC
类型,则不必更改sizeof
部件。 如果你有
C* pC = (C*) malloc(sizeof(C));
然后,您需要记住在更改sizeof(C)
pC
类型时更改零件。
当然,所有这些都可以通过像这样的std::unique_ptr
来避免。
auto pC = std::make_unique<C>();
^ here is the only place you have to specify the type
相关文章:
- C++ typedef 函数指针,并在一个语句中声明一个指针
- 为什么 cout 语句在传递指向函数的指针时没有执行?
- 使用 if (? 运算符) 语句传递带有指针的数组
- 返回指针的语句 - 解释它是如何工作的以及为什么
- 将 OR 放入 if 语句会导致 ISO C++禁止指针和整数之间的比较(f 允许)
- 在其声明的同一语句中使用指针
- C++:如何在 if 语句条件中使用指针
- 是否可以使用指向语句中声明的变量地址的指针"if"
- 如何访问在 if 语句内、外部创建的指针
- 指针变量在遇到断裂语句时重新初始化
- 检查指针是否为null,然后在同一if语句中取消引用它,这样安全吗
- 如何编写涉及指针/向量的 if 语句
- 什么是成员数据指针的正确赋值语句
- C#指针:错误CS0254:固定语句赋值的右侧可能不是强制转换表达式
- 添加printf语句时,NULL指针异常消失
- 创建指向while语句中的指针的指针
- 使用函数指针剪切 if 语句会更有效
- 带有 if 语句的指针(地址)
- 在单个语句中将类类型分配给该类的取消引用指针时执行哪些操作
- C++:将'this'指针与"get"函数一起使用以替换 cout 语句的可能性