EXC_BAD_ACCESS 在用 poitner 分配字符时发生
EXC_BAD_ACCESS occurred when assign char with a poitner
EXC_BAD_ACCESS发生在*str++ = *end;
年。这是怎么回事?
#include <iostream>
using namespace std;
int main() {
char *hello = "abcdefgh";
char c = 'c';
char *str = hello;
//printf("%s",str);
char * end = str;
char tmp;
if (str) {
while (*end) {
++end;
}
--end;
while (str < end) {
tmp = *str;
printf("hello:%s str:%c, end:%cn", hello, *str, *end);
*str++ = *end;
*end-- = tmp;
}
}
return 0;
}
尝试更改字符串文本是未定义的行为。 将您的代码更改为下面的等效代码,您将看到问题:
const char *hello = "abcdefgh";
const char *str = hello;
const char * end = str;
那么你明白为什么线路*str++ = *end;
有问题吗? 您正在尝试写入const
区域,但无法执行此操作。
如果你想要一个更简单的例子:
int main()
{
char *str = "abc";
str[0] = 'x';
}
如果这个简单的程序在
str[0] = 'x';
行被执行。
不幸的是,字符串文字不必在C
中声明为const char*
,C++
带来了这种语法。 因此,即使看起来您没有使用const
,您也是。
如果您希望代码实际工作,请声明一个可写缓冲区,即 char 的array
:
char hello[] = "abcdefgh";
char str[100];
strcpy(str, hello);
char end[100];
strcpy(end, str);
似乎您正在尝试反转字符串。看起来你把事情复杂化了。
在堆栈上声明的C样式字符串必须声明为const char *
,这意味着你不能更改字符,因为它们是常量。
在C++我们使用字符串和字符串迭代器:
#include <iostream>
#include <string>
using std::string;
using std::reverse;
using std::swap;
using std::cout;
using std::endl;
int main(int argc, const char * argv[])
{
string hello("abcdefgh");
reverse(hello.begin(), hello.end());
cout << hello << endl;
return 0;
}
手动地:
static void reverse(std::string & str)
{
string::size_type b = 0, e = str.length() - 1, c = e / 2;
while(b <= c)
{
swap(str[b++], str[e--]);
}
}
递 归:
static void reverse_helper(std::string & str,
string::size_type b,
string::size_type e)
{
if(b >= e)
return;
swap(str[b], str[e]);
reverse_helper(str, ++b, --e);
}
static void reverse(std::string & str)
{
reverse_helper(str, 0, str.length() - 1);
}
相关文章:
- 将超出范围的整数分配给有符号字符类型
- 关于字符数组,我正在尝试将数组中的每个字符分配给另一个值
- 使用动态分配将 char* 复制到另一个字符**
- 将字符逐个分配给指针?
- C++ - 使用基于范围的 for 循环将字符值分配给向量中的字符串不会分配值
- 如何在不知道对应关系的情况下在字符串中搜索字符并将其分配给另一个字符?
- 动态分配字符数组的内存
- C++具有动态分配的字符数组的结构
- 如何在C++中有效地将数字值重新分配给字符数组
- 将静态字符数组中的字符分配给动态分配的字符数组 - 访问冲突
- 将常量字符* 分配给字符*
- 为无符号字符* 分配一个数字
- C++错误字符分配
- C++中的模板方法,用于将 wchar_t* 或字符* 分配给数组
- 为什么C++允许我将常量字符分配给常量字符 *?
- 如何为以下字符分配数字 "@" 或 "#" 或 "^" 和 "*"
- 将 const 无符号字符* 分配给执行就地替换或省略的 std::string
- 为什么可以将常量字符*分配给字符*
- 在C++上将字符分配给多维字符数组时发生逻辑错误
- 如何使用无符号字符分配 #define