指针声明顺序重要吗?

发布于 2025-01-15 11:14:47 字数 452 浏览 0 评论 0原文

我想知道为什么 GS Tselikis 的《C :从理论到实践》练习 8.3 中的代码可以工作,尽管它不应该工作。

int main() {
  double *ptr, i;
  scanf("%lf", ptr);
  printf("Val = %f\n", *ptr);
  return 0;
}

然而,变量声明中的一个小变化会导致预期的行为(因为ptr未初始化)。

int main() {
  double i, *ptr;
  scanf("%lf", ptr);
  printf("Val = %f\n", *ptr);
  return 0;
}

我正在使用 Visual Code Studio 和 clang(Apple LLVM 版本 10.0.0 (clang-1000.11.45.5))。有什么想法吗?

I wonder why the code from exercise 8.3 in C : From Theory to Practice by G.S. Tselikis works, although it shouldn't.

int main() {
  double *ptr, i;
  scanf("%lf", ptr);
  printf("Val = %f\n", *ptr);
  return 0;
}

However, a small change in the variable declaration leads to the expected behaviour (because ptr is not initialized).

int main() {
  double i, *ptr;
  scanf("%lf", ptr);
  printf("Val = %f\n", *ptr);
  return 0;
}

I am using Visual Code Studio and clang (Apple LLVM version 10.0.0 (clang-1000.11.45.5)). Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

念﹏祤嫣 2025-01-22 11:14:47

这两个程序都有未定义的行为,因为您向 scanf() 传递了无效地址来读取数值:ptr 未初始化。

如果您正确地将 ptr 设置为指向 i,两者的行为相同,但第二个程序可以使用初始值设定项更直接地编写:

#include <stdio.h>
int main() {
  double *ptr, i;
  if (scanf("%lf", ptr = &i) == 1)
      printf("Val = %f\n", *ptr);
  return 0;
}

与:

#include <stdio.h>
int main() {
  double i, *ptr = &i;
  if (scanf("%lf", ptr) == 1)
      printf("Val = %f\n", *ptr);
  return 0;
}

Both programs have undefined behavior because you pass an invalid address to scanf() to read the numeric value: ptr is not initialized.

If you properly set ptr to point to i, both will behave the same, but the second program can be written more directly with an initializer:

#include <stdio.h>
int main() {
  double *ptr, i;
  if (scanf("%lf", ptr = &i) == 1)
      printf("Val = %f\n", *ptr);
  return 0;
}

vs:

#include <stdio.h>
int main() {
  double i, *ptr = &i;
  if (scanf("%lf", ptr) == 1)
      printf("Val = %f\n", *ptr);
  return 0;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文