- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面显示的指针分配之间有什么区别:
int i = 5;
int *ptr = &i;
对比
int i = 5;
int *ptr;
ptr = &i;
对比
int i = 5;
int *ptr;
*ptr = &i;
我认为第一个和第二个是相同的,但第三个是不同的。所以我的问题是 1,2 与 3 之间有什么区别?
最佳答案
前两个语句执行相同的操作,但有一些原因(我将详细介绍)更喜欢第一种风格而不是第二种风格。第三种是未定义行为,这是非常糟糕的。它也应该是一个类型错误。
如果您的编译器毫不费力地接受此代码,则说明您没有在打开足够警告的情况下进行编译。它应该注意到您正在取消引用未初始化的指针,并且您正在将指针分配给 int
没有 Actor 。在 gcc 或 clang 上,您可以添加标志 -Wall -Wextra -Wpedantic -Wconversion
和-std=c11
或任何您的目标。
声明int i = 5;
在第三种情况下,与接下来发生的事情基本上无关。声明int *ptr;
是一个未初始化的指针。然后,*ptr = &i;
取消引用该未初始化的指针,如果幸运的话,程序会立即崩溃,让您找到问题所在。如果你运气不好,它会在某个地方弄乱内存的其他部分,从而产生一个奇怪且不可预测的错误,你无法重现,也没有提示它来自哪里。
防御性编码的一个好习惯是编写尽可能多的变量作为静态单一赋值。也就是说,只要有可能,您就声明并初始化变量一次,如 const
,并且永远不要再次修改它们。在这种情况下,这将是:
const int i = 5;
const int * const ptr = &i;
这也消除了一大类错误,即我在本打算使用旧变量的情况下使用了变量的新值,反之亦然。编译器无法为我捕获这些。如果i
和ptr
只有一种含义,当我重构时,不可能混淆它在任何给定时间的含义。至于效率,那就是洗。如果我根据某个值进行计算,我要么再次需要原始值,要么不需要。如果我这样做,覆盖它就是一个错误。如果不这样做,依赖性分析应该确定编译器不需要再保留该值。
你不能总是这样做:一个非常常见的例子是循环计数器。在这些情况下,一个好的习惯(尽管你可以找到我没有严格遵循自己建议的例子)是始终将所有内容初始化为 0
, NULL
或其他一些明显无效的值。这样,如果您在真正初始化之前不小心使用了它,至少结果将是错误的并且是可重现的。所以:
int i = 5;
int *ptr = NULL;
*ptr = &i; /* FIXME: Undefined behavior! */
在您要瞄准的大多数操作系统上,这至少会在发生逻辑错误的地方立即使您的程序崩溃,从而很容易找到它。 (因为,在过去,我的 C 和 C++ 答案引起了一两个人的注意,他们想指出语言标准不能保证这一点,我同意,它是不可移植的。但是我发现它在实践中很有用。)否则,如果您在调试器中单步执行,寻找错误,那么很明显该变量在使用时未初始化,而如果它只是包含堆栈上的任何垃圾,也可能不是。
另一方面,如果您的编译器可以检测到正在使用的未初始化变量,这种习惯可能会阻止它这样做。
关于c - C中指针赋值的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48821309/
你能解释一下这个作业是如何完成的吗, var fe, f = document.forms[0], h; 哪个等于哪个。 最佳答案 以上等同于 var fe; var f = document.for
据我测试,这两种方法都有效,但我不知道哪一种最好,也不知道它们之间的区别,这就是我想知道的。 以下是两种方法: window.location = 'http://www.google.com'; w
我正在处理用字符串填充的 numpy 数组。我的目标是分配给第一个数组 a 的切片,值包含在较小尺寸的第二个数组 b 中。 我想到的实现如下: import numpy as np a = np.em
在我使用过的其他语言(如 Erlang 和 Python)中,如果我正在拆分字符串并且不关心其中一个字段,我可以使用下划线占位符。我在 Perl 中试过这个: (_,$id) = split('
我认为这似乎很简单,但我对调用、应用、绑定(bind)感到困惑。等等 我有一个事件监听器 red.addEventListener("click", function() { j = 0;
这个问题在这里已经有了答案: What is the python "with" statement designed for? (11 个答案) 关闭 7 年前。 使用有什么区别: iFile =
这个问题在这里已经有了答案: What is the python "with" statement designed for? (11 个答案) 关闭 7 年前。 使用有什么区别: iFile =
几周前我们开始写一篇关于 Haskell 的论文,刚刚接到我们的第一个任务。我知道 SO 不喜欢家庭作业问题,所以我不会问怎么做。相反,如果有人能将我推向正确的方向,我将不胜感激。鉴于它可能不是一个特
我正在尝试为我的函数的变量根分配一个值,但似乎不起作用。我不明白这个问题。 hw7.c:155:7:警告:赋值使指针来自整数而不进行强制转换[默认启用] root = 负载(&fp, 大小); 此代码
我昨天花了大约 5 个小时来完成这个工作,并使用这个网站的帮助让代码可以工作,但我认为我这样做的方式是一种作弊方式,我使用了 scanf 命令。无论如何,我想以正确的方式解决这个问题。多谢你们!哦,代
我需要一些帮助来解决问题。 我有这个文本文件: 我将文本内容输入到字符串二维数组中,并将其转换为整数二维数组。当我转换为 int 数组时,nan 被替换为零。现在,我继续查找二维数组中每行的最大值和最
假设我有一个只能移动的类型。我们停止现有的默认提供的构造函数,但 Rvalue 引用引入了一种新的“ flavor ”,我们可以将其用于签名的移动版本: class CantCopyMe { priv
假设我有两个简单的对象,我想创建第三个对象来连接它们的属性。这非常有效: (()=>{ const a1 = {a: 2, b: 3} const b1 = {a: 100, c: 5}
我想知道我是否可以稍后在这样的代码中为 VAR 赋值 var myView: UIView func createView() { myView = UIView() { let _view =
我遇到了一些 Javascript/HTML/CSS 代码的问题。我对创建网站还很陌生,所以请多多包涵。 我最终想做的是从 javascript 中提取一个动态值并使用它对一些 div(在容器中)进行
#include class Box{ public: int x; Box(){ x=0; std::cout No move construction thanks to RV
我发现在javascript中&=运算符是按位赋值: var test=true; test&=true; //here test is an int variable javascript中是否存在
请帮助完成赋值重载函数的执行。 这是指令: 赋值运算符 (=),它将源字符串复制到目标字符串中。请注意,目标的大小需要调整为与源相同。 加法 (+) 和赋值 (=) 运算符都需要能够进行级联运算。这意
我有一个名为 SortedArrayList 的自定义结构它根据比较器对其元素进行排序,我想防止使用 operator[] 进行分配. 示例: 数组列表.h template class Array
我是 python 的新手,我看到了这种为列表赋值的形式 color= ['red' if v == 0 else 'green' for v in y] 但是如果我尝试用 3 个数字来做,例如 co
我是一名优秀的程序员,十分优秀!