内存访问冲突。什么';这个看似简单的程序怎么了? 这是一个我刚刚写的快速程序,看看我是否记得从零开始如何启动C++程序。它只是反转一个字符串(在适当的位置),在我看来通常是正确的。为什么这样不行 #include <iostream> using namespace std; void strReverse(char *original) { char temp; int i; int j; for (i = 0, j = strlen(original) - 1; i < j; i++, j--) { temp = original[i]; original[i] = original[j]; original[j] = temp; } } void main() { char *someString = "Hi there, I'm bad at this."; strReverse(someString); } #包括 使用名称空间std; 无效格式副本(字符*原件) { 焦炭温度; int i; int j; 对于(i=0,j=strlen(原始)-1;i

内存访问冲突。什么';这个看似简单的程序怎么了? 这是一个我刚刚写的快速程序,看看我是否记得从零开始如何启动C++程序。它只是反转一个字符串(在适当的位置),在我看来通常是正确的。为什么这样不行 #include <iostream> using namespace std; void strReverse(char *original) { char temp; int i; int j; for (i = 0, j = strlen(original) - 1; i < j; i++, j--) { temp = original[i]; original[i] = original[j]; original[j] = temp; } } void main() { char *someString = "Hi there, I'm bad at this."; strReverse(someString); } #包括 使用名称空间std; 无效格式副本(字符*原件) { 焦炭温度; int i; int j; 对于(i=0,j=strlen(原始)-1;i,c,C,您正在尝试修改字符串文字-在静态存储中分配的字符串。这是未定义的行为(通常会使程序崩溃) 在反转之前,应分配内存并将字符串文本复制到此处,例如: char *someString = "Hi there, I'm bad at this."; char* stringCopy = new char[strlen( someString ) + 1]; strcpy( stringCopy, someString ); strReverse( stringCopy ); delete[] stri

您正在尝试修改字符串文字-在静态存储中分配的字符串。这是未定义的行为(通常会使程序崩溃)

在反转之前,应分配内存并将字符串文本复制到此处,例如:

char *someString = "Hi there, I'm bad at this.";
char* stringCopy = new char[strlen( someString ) + 1];
strcpy( stringCopy, someString );
strReverse( stringCopy );
delete[] stringCopy;//deallocate the copy when no longer needed

无法更改字符串文字(静态分配)。要想做你想做的事,你需要使用以下方法:

int main()
{
    char *str = new char[a_value];
    sprintf(str, "%s", <your string here>);
    strReverse(str);
    delete [] str;
    return 0;
}
intmain()
{
char*str=新字符[a_值];
sprintf(str,“%s”);
strReverse(str);
删除[]str;
返回0;
}

[编辑]strdup也有效,strncpy也有效。。。我相信还有很多其他的方法:)

请参阅sharptooth以了解解释

请尝试以下方法:

#include <cstring>

void main()
{
    char someString[27];
    std::strcpy( someString, "Hi there, I'm bad at this." );
    strReverse( someString );
}
#包括
void main()
{
字符字符串[27];
std::strcpy(一些字符串,“你好,我不擅长这个。”);
strReverse(someString);
}

更好的办法是,忘掉
char*
,改用
。这是C++,毕竟不是C。< /p> 如果您改变了这个,这就使得<代码>字符串Stry< /Cord>指向只读字符串文字的指针:

char *someString = "Hi there, I'm bad at this.";
char someString[] = "Hi there, I'm bad at this.";
为此,它使
someString
成为一个可修改的
char
数组,从字符串文本初始化:

char *someString = "Hi there, I'm bad at this.";
char someString[] = "Hi there, I'm bad at this.";
你应该有更好的结果

而原始代码(
char*
)中的
someString
类型允许修改它所指向的
char
,因为它实际上指向一个字符串文本(不允许修改)试图通过指针进行任何修改都会导致技术上称为未定义的行为,在您的情况下,这是内存访问冲突。

char *someString = "Hi there, I'm bad at this.";
使
someString
指向无法修改的字符串文字。使用字符数组代替原始指针:

char someString[] = "Hi there, I'm bad at this.";
char str[] = "You can write to me, but don't try to write something longer!";

使用更严格的编译器设置时,此代码甚至不应编译:

char* str = "Constant string";
因为它应该是常数:

const char* str = "Now correct";
const char str[] = "Also correct";
这允许您更快地捕获这些错误。也可以只使用字符数组:

char someString[] = "Hi there, I'm bad at this.";
char str[] = "You can write to me, but don't try to write something longer!";

为了完全安全,只需使用std::string。毕竟你使用的是C++,原始字符串操作非常容易出错。

如果这不是作业,C++标签要求你使用C++标准库:

std::string s("This is easier.");
std::reverse(s.begin(), s.end());

哦,它是
intmain()
,总是
intmain()
,该死

个人,我会使用StrudUp,但是我是OrdStudio。StrudUp()很好,但是它需要使用For()和使用FILL(0不被认为是好的C++,而应该是OLD C.C,否则我也更喜欢StrudUp)。.那么区别是什么呢?是不是我在声明中给它赋值?如果我把它作为char*someString;然后将用户输入传递给它,我就可以执行这个操作了?关键是内存是如何分配的。如果是堆或堆栈分配的,就可以了。在原始代码中,当程序启动并运行时,它是静态分配的标记为只读,因此禁止向其写入。正如@sharptooth所说,您已声明“somestring”是一个指向文字字符串的指针-即。它指向一些作为程序代码一部分的存储,因此不可修改。您必须将其放入可修改内存中才能将其反转。只需向上面的人问这个问题,然后阅读您的答案:)谢谢。实际上它必须编译。为了兼容性,有一个从
const char[]
char*
的转换。它已被弃用,您不应该起诉它,但它(仍然)是标准的一部分。不,
char*str=“Constant string”
必须编译。4.2/2规定,不是宽字符串文字的字符串文字可以转换为tpy的右值“指向
char
”。一致编译器不能拒绝这个初始化。谢谢,我使我的文章更准确——它是关于编译器设置(你可以设置为比标准更严格)。如果你说“毕竟你使用C++”,我认为当你引用严格符合代码时,你真的不能说“不应该编译”。你可以说,你可以要求编译器拒绝这个符合标准的代码,但我认为它应该拒绝它太强了(IMHO)。没有“比标准更严格”的事情,因为严格程度取决于它执行标准的程度。正如sbi的回答所示,使用C++标准库可以做得更简单。如果因为某种原因,你更喜欢坚持C函数,就像你自己的代码一样,也许你应该把问题重新标记为C。马克的问题显然是针对C实现的。他使用的是命名空间,包括C++头。我应该把它标记为C。我的目标是避免使用像这样的基本功能的库:)感谢库,当它们可用时使用它们几乎总是更明智的做法。而且,如果这是一件基本的事情,那么你为什么需要SO社区的帮助呢?最重要的是,strlen()是一个库函数。。。