【问题标题】:Use of unassigned local variable when taking the address of variable获取变量地址时使用未分配的局部变量
【发布时间】:2015-09-04 21:03:17
【问题描述】:

为什么在这段代码中编译器在获取该变量的地址时不显示错误Use of unassigned local variable

int i;
int* p = &i; // Use of unassigned local variable i ?
int j = *p; // j = 0
j = i;      // both valid

这样可以正常编译,j 的值为 0。

【问题讨论】:

  • 因为可能有*p = 5;之类的代码,编译器无法轻易检测到,将5设置为i
  • @Eser 没有必要这样做。编译器可能会停在&i 使用未分配的局部变量。
  • 我认为,不会。编译器可以假设p稍后会对其进行初始化。因为这是一个不安全的代码。无论如何,这并不完全适合 SO。

标签: c# unsafe unassigned-variable


【解决方案1】:

当你在 C# 中处理unsafe 代码时,你基本上是在告诉编译器,不要警告我,我已经知道了。所以编译器只会做你告诉它的事情。

【讨论】:

  • 也许吧。编译器仅在获取i 的地址时暂停该错误。不仅使用 unsafe 会挂起错误。
  • @Daniel,如果你只是删除 int* p = &i。编译器会警告你。所以它与unsafe 代码无关。比较 int i;int* p = &i; int j = i; int i; int j = i;
  • @Eser 编译器可能足够聪明,可以优化出unsafe code
【解决方案2】:

代码完全有效,因为您没有使用未分配的变量,而是使用了它的指针。

最后一行是有效的,它不是使用未分配的变量而是解引用指针。

这就是为什么在您切换到不安全模式之前 c# 是托管语言的原因。

'j'的零可能是调试模式造成的。

【讨论】:

  • 'j'的零可能是调试模式造成的。我不这么认为。没关系。这是默认值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
  • 2013-10-18
  • 2015-11-09
  • 2012-05-18
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
相关资源
最近更新 更多