char指针违反访问权限
Char pointer throwing Access Violation
我不明白为什么此代码会抛出未经处理的"访问违规"例外。这是一个简单的程序,试图在跳过某些字符的同时将一个炭指针字符串复制到另一个字符串(索引:3,4,5)
#include <conio.h>
#include <iostream>
using namespace std;
void main()
{
char str[20];
char *str1 = "abcdeabcde", *str2 = "";
int i, dx = 0;
for(i=0; *(str1+i)!=' '; i++)
if(i<3 || i>5)
{
*(str2 + dx) = *(str1 + i);
dx++;
}
*(str2+dx) = ' ';
cout<<str2;
_getch();
}
使用语法*(str + i)
的分配在以下功能代码中正常工作(这是Getline的实现)
int getstr(char *str, int n)
{
char ch;
int i = 0;
for(i=0; i<n && (ch = _getch())!= 'r'; i++)
{
if(ch == 'b')
{
if(i == 0)
{
i = -1; continue;
}
else
{
cout<<"b b";
i -= 2;
}
}
else if(ch > 31 && ch < 127 && i<n-1)
{
cout<<ch;
*(str + i) = ch;
}
else
{
cout<<"a";
i--;
}
}
*(str + i) = ' ';
return i+1;
}
那么,为什么在第二种情况下可行,但不在第一种情况下起作用?
那么,为什么在第二种情况下它可以起作用,但不在第一种情况下起作用?
因为在第一种情况下,这些是字符串char *str1 = "abcdeabcde", *str2 = "";
,您不允许您更改str1
和str2
这是C/C 中众所周知的未定义行为。请参阅此列表:C 程序员应了解的所有常见不确定的行为是什么?
特别是这一行:
- 试图在其寿命(UB) 的情况下修改字符串文字或任何其他const对象
这是您的问题:
*(str2 + dx) = *(str1 + i);
str2
是字符串文字的指针。只要您不读取其NUL字符,您就可以从str2
中阅读,但是您不允许在其中写入,因为编译器可能会将字符串文字存储在您二进制的特定且只读的部分中。p>在这里,您将其写入str2
的末端。这是双重未定义的行为!
相关文章:
- 编写一个函数来删除单链表中的节点(尾部除外),仅授予对该节点的访问权限
- 为什么我在空指针错误(链表)中获取成员访问权限
- 为什么"delete"操作员给我访问权限冲突
- 从根权限进程创建可访问的文件
- 父级的子属性 - 访问权限
- 从C++获得对在python中创建的C++类的访问权限
- 威纳派读取自定义文件或文件夹的所有访问权限
- 授予另一个类对特定方法的访问权限
- 链接 boost 库时"Error while loading shared libraries"引发的,除了我无法使用 root 访问权限来修复它
- 正确的友元定义,以授予 std::map 对私有默认构造函数的访问权限
- TOCTTOU - 在处理文件之前使用访问权限
- 如何通过指针仅向结构的某些成员提供可变访问权限
- main() 对连续运行的线程中的编辑值具有只读访问权限 - C++
- 如何使用 c++ 创建对"everyone"具有共享访问权限的文件夹
- 嵌套类嵌套类的访问权限
- 为什么继承的受保护操作员=()有公共访问权限
- Lambda 函数,用于调用有权访问类成员的成员函数
- 为什么拥有不同访问控制权限的成员的工会不是标准布局
- 获取从基类指针到具有不同类型的两个派生成员变量的访问权
- 拒绝访问nt权限本地服务