char指针违反访问权限

Char pointer throwing Access Violation

本文关键字:访问权 权限 访问 指针 char      更新时间:2023-10-16

我不明白为什么此代码会抛出未经处理的"访问违规"例外。这是一个简单的程序,试图在跳过某些字符的同时将一个炭指针字符串复制到另一个字符串(索引: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 = "";,您不允许您更改str1str2

的内容

这是C/C 中众所周知的未定义行为。请参阅此列表:C 程序员应了解的所有常见不确定的行为是什么?

特别是这一行:

  • 试图在其寿命(UB)
  • 的情况下修改字符串文字或任何其他const对象

这是您的问题:

*(str2 + dx) = *(str1 + i);

str2是字符串文字的指针。只要您不读取其NUL字符,您就可以从str2中阅读,但是您不允许在其中写入,因为编译器可能会将字符串文字存储在您二进制的特定且只读的部分中。p>在这里,您将其写入str2的末端。这是双重未定义的行为!