Chapter1.exe中0x003860EF处的未处理异常:0xC0000005:访问冲突写入位置0x0038EE7C

时间:2013-09-05 22:25:50

标签: c++ visual-c++

我正在编写一个非常简单的测试程序来交换char *指向的字符串中的所有字符。但是,我从Visual C ++中得到了一个非常奇怪的例外。

我的代码将粘贴在下面,第1章是项目的名称。

提前感谢所有人,请随时在下面发帖以询问任何进一步的问题。

Question2.h

#ifndef _QUESTION2_H_
#define _QUESTION2_H_

namespace Q2
{
    void swap(char *begin, char *end);

    void reverse(char *str);

    void run();
}

#endif

Question2.cpp

#include <iostream>

#include "Question2.h"

using namespace std;

namespace Q2
{
void swap(char *begin, char *end)
{
    char tmp = *begin;
    *begin = *end;
    *end = tmp;
}

void reverse(char *str)
{
    char *begin = str;
    char *end = str;

        while(*end != NULL)
        end++;
    end--;

        for(; begin < end; begin++, end--)
        swap(begin, end);
}

void run()
{
    char *str1 = "hello";

    reverse(str1);

    cout << str1 << endl;

    return;
    }
}

的main.cpp

#include <iostream>

#include "Question2.h"

int main()
{
    Q2::run();

    return 0;
}

2 个答案:

答案 0 :(得分:1)

宣言:

char *str1 = "hello";

创建一个指向字符串文字的指针(常量)。您无法写入缓冲区(交换函数尝试执行此操作),否则会导致未定义的行为。如果您真的想要使用C样式字符串,那么您可以将其声明为:

char str1[] = "hello";

使用该声明,它在堆栈上创建存储并将空终止的字符串复制到该数组中;它仍然是以空字符结尾的字符串。

从正确性的角度来看另一件事:找到字符串结尾的循环应该与'\0'进行比较而不是NULL:

    while(*end != '\0')

答案 1 :(得分:0)

使用std::string

,它更容易,更安全,更易读
#include <string>

void swap(std::string& str, int index1, int index2) {

    char temp = str[index1];
    str[index1] = str[index2];
    str[index2] = temp;

}

void reverse(std::string& str) {

    for (int i = 0; i < str.size() / 2; i++)
        swap(str, i, str.size() - i - 1);

}