反转char数组导致访问冲突

时间:2015-03-24 10:55:55

标签: c++ arrays pointers

我只是想编写一个用于反转char数组的代码(或指针char。我失败了,因此使用了char数组)。像“美国空军”将是“FAUS”首先我用指针这样做,所以我有访问违规。

代码:

    #include <iostream>

using namespace std;

int getlength(char *);
void reverse (char * ch );

int main ()
{
    char  *ch ="USAF";
    /*cout<<*ch;*/

    int len = getlength(ch);
    reverse(ch);

    cout<<"Reverse :";


    for(int i =0;i <len; i++)
        cout<<*(ch + i);

    cin.get();

}


int getlength(char * ch)
{
    int len=0;
     char *address = ch;
    for(; *(ch)!='\0' ; ch++)
        len++;

    ch=address;
    return len;
}

void reverse(char *ch )
{
    char tmp;
    int i,j,len=getlength(ch);

    for(i=0;i<(len/2);i++)
        for(j=len-1;j>(len/2);j--){
            tmp=*(ch+i);
            *(ch+i)=*(ch+j); //ACCESS VIOLATED 
            *(ch+j)=tmp;


        }

为什么会这样? ch + i和+ j是char指针的长度(数组真的应该在什么时候调用它?)但它会抛出一个c?

并且我当前的代码几乎没有指针,但由于数组是以某种方式指针而且它们通过引用调用,所以我想我做到了:

   #include <iostream>

using namespace std;

void reverse (char ch [],int len);

int main ()
{
    char  ch [] ="USAF";
    int len = sizeof(ch);
    reverse(ch,len);

    cout<<"Reverse :";

    for(int i =0;i <len; i++)
        cout<<ch[i];
    cin.get();

}



 void reverse(char ch [],int len)
{

    int i,j; 
    char tmp;
    for(i=0;i<len;i++)
        cout<<*(ch+i);

    cout<<*(ch+(3-1));


for(i=0;i<(len/2);i++)
for(j=len-1 ; j>(len/2);j--){

tmp = ch[i];
ch[i]=ch[j];
ch[j]=tmp;

}

但是当我编译它时显示:“F AUS”从那个空白角色出现的地方看起来很奇怪? (有些cout线只是剩下的,不介意它们)

PS:这是我在stackoverflow中的第一篇文章(酷名btw :))。我非常喜欢这里的专业氛围,并且发现这是一个提出自己问题的好地方+当我获得大量知识回答别人时。

2 个答案:

答案 0 :(得分:1)

变量ch指向一个字符串文字,它是常量字符的数组。换句话说,尝试更改它将导致undefined behavior

而是将其声明为数组,例如

char ch[] = "USAF";

然后编译器在堆栈上创建字符串并且它不是常量,因此您可以更改数组的内容。

答案 1 :(得分:0)

http://cpp.sh/3ekd

#include <iostream>

using namespace std;

int getlength(char *);
void reverse(char * ch);

int main()
{
    char  ch[] = "USAF";
    /*cout<<*ch;*/

    int len = getlength(ch);
    reverse(ch);

    cout << "Reverse :";


    for (int i = 0; i < len; i++)
        cout << *(ch + i);

    cin.get();

}


int getlength(char * ch)
{
    int len = 0;
    char *address = ch;
    for (; *(ch) != '\0'; ch++)
        len++;

    ch = address;
    return len;
}

void reverse(char *ch)
{
    int len = getlength(ch);

    for (int i = 0; i < len / 2; i++) {
        char c = ch[i];
        ch[i] = ch[len - i - 1];
        ch[len - i - 1] = c;
    }
}