【问题标题】:Thread 1: EXC_BAD_ACCESS (code=1, address=0x0) error in xcode线程 1:xcode 中的 EXC_BAD_ACCESS (code=1, address=0x0) 错误
【发布时间】:2018-05-11 01:28:06
【问题描述】:

我是一名业余程序员,正在学习如何在 xcode 中使用 c++,并且我一直在尝试创建一个程序,您可以在其中回答所提出的问题,并且问题会根据您的答案而有所不同。问题是,我不断收到错误消息:线程 1:EXC_BAD_ACCESS (code=1, address=0x0),我不知道是什么原因造成的。这是我目前的代码:

#include <iostream>
#include <string>
using namespace std;
int main() {


    string name;
    cout << "what is your name ";
    getline (std::cin, name);
    string yes;
    cout << "ok, " << name << ", do you want to play a game?  ";
    getline (std::cin, yes);
    cout << "\nno " << std::endl;

    string input =0;
    cin >> input;
    string Yes = "yes";
    string No = "no";

    if (input == No)
    {
        cout << "ok, sorry" << endl;
    }
    else if (input == Yes)
    {
        cout << " a question" << endl;
    }
}

【问题讨论】:

  • string input =0; Rubber ducky 想知道你想在这里发生什么。
  • 另外,如果你是一个业余程序员,我建议你阅读好的 C++ 材料。没有任何 C++ 书籍在任何代码示例中都有 user4581301 指出的错误,除非它是您的拼写错误。
  • 将“输入”声明为其余代码的标识符。其中大部分是随机教程拼凑在一起的,所以我不完全确定。对不起。
  • @j_lo2004 -- 为什么将字符串设置为“0”?将设置删除为 0 个东西。
  • string 是一个字符序列。通常,您会在引号中指定某些内容。 string input = "Nothing to see here. Move along."; 给它分配一个数字是不寻常的。在这种情况下,这是致命的,因为幕后发生了一些非常巧妙的事情。我想我知道发生了什么,我正在做一些实验,看看我是否正确。

标签: c++ xcode


【解决方案1】:

解决方案

改变

string input =0;

string input;

input 将被构造为一个空字符串。

那么刚刚发生了什么?

string input =0;

调用编号为 0 的 string 构造函数。对于采用整数的字符串没有直接构造函数,但是

string(const CharT* s, 
       const Allocator& alloc = Allocator() );

足够接近。整数 0 被视为指向 0 的指针,NULL,而可怜的 string 试图从空指针构造自己。这意味着它将从NULL 复制字符,直到找到以字符串结尾的空字符。

幸运的是,无处可去的进程很快就停止了,因为前几千字节的内存几乎总是被标记为禁止区域,当您尝试访问该区域中的任何位置时,程序就会崩溃。这使得空指针错误几乎可以立即检测到并且非常容易调试。只需等待程序崩溃,然后返回堆栈以查看空指针的来源。可能需要更多的工作才能找出它为什么为空,但如果编程很容易,每个人都会这样做。

为了验证假设,我整理了一个简单的类来模拟行为而不会崩溃

#include <iostream>

class test
{
public:
    test (const char * valp)
    {
        std::cout << "in char * constructor. Got: " << (void*) valp;
    }
};
int main() {
    test input =0;
}

输出是

在 char * 构造函数中。得到:0

表明 0 确实足以说服 test 接受 0 作为 char 指针。

请注意,这只是零附近的一个特例,最有可能支持良好的 ol'#define NULL 0 宏和​​p>

test input =1;

被编译器成功捕获为废话并被拒绝。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 2014-09-19
    • 2014-05-21
    • 2013-10-14
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多