为什么我得到EXC_BAD_ACCESS?

时间:2014-11-05 08:04:55

标签: c exc-bad-access

我想要反转一个字符串,但我在swap char上出错了。

有人可以帮我这个吗?

char*  reverse_char(char* src){
    char *p,*q;
    p = q = src;
    while(*(p) != '\0'){
        p++;
    }
    p--;

    char  temp = '\0';
    while (p > q) {
        temp = *p;
        *p = *q; // I got exec bad access here ??? why 
        *q = temp;
        p--;
        q++;
    }
    return src;
}

这是主要方法。

int main(int argc, char const* argv[])
{
    char *hi = "hello world!\n";
    printf("%s", hi);

    reverse_char(hi);
    printf("%s", hi);
    return 0;
}

2 个答案:

答案 0 :(得分:5)

char *hi = "hello world!\n";替换为char hi[] = "hello world!\n";

"hello world!\n"是字符串文字,可能无法写入导致访问错误。修改字符串文字的内容是未定义的行为,它可能会静默写入内容,引发访问错误或者可能会执行其他意外操作。 (所以你不应该写字符串文字)

总结

char a[] = "...";  /* Contents of a can be assigned */
char *a = "...";   /* Writing to contents of memory pointed by a leads to UB */

答案 1 :(得分:2)

尽管C中的字符串文字具有非常量字符数组的类型,但它们可能不会更改。

来自C标准(6.4.5字符串文字)

  

7未指明这些阵列是否与它们不同   元素具有适当的值。 如果程序尝试   修改这样的数组,行为是未定义的。

最好将使用字符串文字初始化的指针声明为类型const char *,就像在C ++中完成一样。例如

const char *hi = "hello world!\n";

在这种情况下,您将得到一个可以理解的编译时错误而不是运行时错误,因为该函数的参数被声明为非const字符指针。

您必须使用字符数组而不是指向字符串文字的指针。

例如

char hi[] = "hello world!\n";

当指针指向空字符串时,它有一些问题的功能。在这种情况下操作后

p--;

你可以得到无效的指针,这个指针不必小于src。

我会按照以下方式编写函数

char*  reverse_string( char *s )
{
    char *p = s;

    while ( *p ) ++p;

    if ( p != s )
    {
        for ( char *q = s; q < --p; ++q )
        {
            char c = *q;
            *q = *p;
            *p = c;
        }
    }

    return s;
}