【问题标题】:C++ Segmentation Fault while using online Compiler but the Same works in VS Code使用在线编译器时出现 C++ 分段错误,但在 VS Code 中同样有效
【发布时间】:2020-08-20 07:03:27
【问题描述】:

我是 C++ 编程新手。我在在线编译器中编译我的代码时遇到Segmentation Fault 错误,但是当我尝试在离线时使用Visual Studio Codeg++ 编译它时(意味着在我的本地机器中)工作正常。

我试过的Code

`

#include <iostream>

int main() {
    int *ptr;
    *ptr = 10;
    cout<<*ptr; //Prints 10 
    cout<<ptr; //Prints Some garbage address
}

但是上面的程序不能在在线编译器中运行(使用 onlinegdb)。 我的机器配置 g++ 11 Visual Studio Code 2016

【问题讨论】:

  • 欢迎来到 SO!这段代码没有多大意义。如果您尝试创建一个整数,请删除指针。如果您尝试创建一个指针,则需要分配一些内存或将其指向一些有效的内存块。取消引用空指针是未定义的行为,这意味着它可以做任何事情(包括似乎可以工作)。
  • 嗨 ggorlen,我只是在玩指针。我没有编写任何有意义的代码,这里未分配的指针将包含一些垃圾地址,对吗?我们可以存储我阅读的博客中同样提到的内容,但为什么在线和离线编译器之间存在不匹配?
  • 正如我上面解释的,行为是不确定的,所以实际上任何事情都可能发生。请参阅 thisthis。在空指针偏离*ptr = 10; 之后,在你的cout 行中发生了什么是不可能的。如果您使用 valgrind 之类的 sanitizer 运行此程序,您的程序将无法通过此行。我建议在你学习 C++ 时为你的所有程序使用这样的工具。

标签: c++11 pointers


【解决方案1】:

*ptr = 10; 这一行根本上是错误的,因为您不能通过取消引用指针来赋值。

这样做的正确方法是:

#include <iostream>
using namespace std;

int a=10;
int *ptr;
ptr=&a;
cout<<ptr<<endl;
cout<<*ptr<<endl;

【讨论】:

  • “你不能通过取消引用指针来赋值” - 当然你可以,只要这个点实际上指向某个地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2015-06-19
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
相关资源
最近更新 更多