gpt4 book ai didi

c++在写入公共(public)变量时崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 14:37:33 25 4
gpt4 key购买 nike

我用 C++ 写了一个简单的测试程序,但为什么会崩溃:

s[i] = s[i] - 'a' + 'A';

异常(exception):访问冲突写入位置 0x01327808

#include "stdafx.h"
#include <iostream>

using namespace std;

class String
{
public:
char *s;
int len();
void upper();

String(char*);

};

String::String(char*x)
{
s = x;
}

int String::len()
{
return strlen(s);
}

void String::upper()
{
for (int i = 0; i < len(); i++)
{
if (s[i] >= 'a' && s[i] <= 'z')
{
cout << s[i] << endl;
s[i] = s[i] - 'a' + 'A';
}
}
};

int main()
{
String s("test");
s.upper();

cout << s.len() << endl;
cout << s.s << endl;

system("pause");
}

最佳答案

这是因为:

String s("test");

它所做的是将 const char * "test" 传递给您的构造函数,然后它只存储该字符串的地址。

稍后,当您尝试修改指针指向的内存时,这是未定义的行为。

通常,字符串文字将存储在只读内存中以允许进行某些优化,任何修改它们的尝试都将导致访问冲突。

如果你要改变:

String s("test");

进入:

char cp[] = "test";
String s(cp);

您可能会发现它会起作用。

但是,您的类实际上应该为自己的目的制作字符串的拷贝 - 单纯的指针是不安全的,因为传递给您该指针的代码也可以更改它的内容.

您应该在代码中进行更改以使其更安全:

  • s 应该是私有(private)成员,而不是公共(public)成员。
  • 您的构造函数应该制作自己的字符串拷贝:
    s = new char[strlen(x)+1];
    strcpy (s,x );
  • 添加一个析构函数来解决这个问题:
    String::~String() { delete[] s;
  • 考虑让您的构造函数接收一个const char *(因为您不会更改它)。
  • 考虑使用 toupper(ch) 而不是 ch - 'a' + 'A'。虽然您的公式适用于 ASCII,但我认为标准不能保证它。
  • cout 东西应该由类处理,而不是类之外的代码(一旦您将 s 设为私有(private),这将是强制性的。
  • 考虑使用无参数构造函数,以便字符串数组正常工作。

关于c++在写入公共(public)变量时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4063405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com