gpt4 book ai didi

c++ - 字符指针抛出访问冲突

转载 作者:行者123 更新时间:2023-11-30 01:09:04 25 4
gpt4 key购买 nike

我不明白为什么这段代码会抛出一个未处理的“访问冲突”异常。这是一个简单的程序,它试图将一个字符指针字符串复制到另一个字符指针字符串,同时跳过一些字符(索引处的字符: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)!='\0'; i++)
if(i<3 || i>5)
{
*(str2 + dx) = *(str1 + i);
dx++;
}
*(str2+dx) = '\0';
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) = '\0';
return i+1;
}

那么为什么这在第二种情况下有效,而在第一种情况下却无效?

最佳答案

So why does this work in the second case but not in first?

因为在第一种情况下,这些是文字字符串 char *str1 = "abcdeabcde", *str2 = ""; 并且您不能更改任何一个 str1< 的内容str2

这是 C/C++ 中众所周知的未定义行为。查看此列表:What are all the common undefined behaviours that a C++ programmer should know about?

特别是这一行:

  • 尝试在其生命周期 (UB) 期间修改字符串文字或任何其他 const 对象

关于c++ - 字符指针抛出访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40909208/

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