1

我刚刚写了一个非常简单的字符串反转函数,遇到了一个我无法理解的问题:

void reverse(char *data) {
    int length = 0,i;   
    char *temp,*start,*end;
    start = data;
    end = data;
    length = strlen(data);
    end = end + (length -1);
    for(i=0; i< length/2; i++) {
        *temp = *end;
        *end = *start;
        *start = *temp;
        start++;
        end--;
    }
}

int main()
{   
    int length1 = 0;
    char data1[100] = "I am megharaj from india";
    printf("data1 %s\n", data1);
    reverse(data1);
    printf("reversed\n");
    printf("data1 %s\n", data1);    
    return 0;
}

这会产生分段错误,但是如果我将其更改为char *tempchar temp则一切正常,如下所示:

void reverse(char *data) {
    int length = 0,i;   
    char temp,*start,*end;
    start = data;
    end = data;
    length = strlen(data);
    end = end + (length -1);
    printf("length %d\n", length);
    for(i=0; i< length/2; i++) {
        temp = *end;
        *end = *start;
        *start = temp;
        start++;
        end--;
    }
}

无法理解原因;你能解释一下吗?

4

3 回答 3

2

当您使用char *temp;并且:

*temp = *end;

您正在取消引用未初始化的指针并写入未定义的位置,调用未定义的行为和(幸运的是)崩溃。无法保证崩溃。当你使用 时,你已经让编译器为这个值char temp;分配了空间。char有了指针,指针本身就有 4 或 8 个字节的存储空间,但它需要指向一个字符位置——而且你还没有设置它这样做。(你也不应该;这个char *temp版本基本上是一个错误。)

  • 使用不会崩溃的版本。
  • 当您使用指针时,请始终确保您知道它所指向的内容。
于 2013-11-06T05:51:20.953 回答
2

char *temp未在任何地方初始化 - 您在此处取消引用垃圾值:

*temp = *end;

temp具有存储类auto,默认情况下未初始化为任何内容。

改用 a char。像:

char temp;

此外,您需要char比字符串长度少 1 以便忽略该NUL字符:

end = end + (length-1 ); // I added this part because in your intial code 
//(on posting question) this line was end = end + (length);

更正的代码:

void reverse(char *data) {
    int length = 0,i;   
    char temp,*start,*end;
    start = data;
    end = data;
    length = strlen(data);
    end = end + (length-1 );
    for(i=0; i< length/2; i++) {
        temp = *end;
        *end = *start;
        *start = temp;
        start++;
        end--;
    }
}

这是完整的程序

于 2013-11-06T05:51:55.603 回答
1

*start 指向 data1 数组,我在这里start = data;

*end 指向 data1 数组,我在这里end= data;

*temp没有指向任何地方。

内存未分配char *temp,您正在尝试存储*endin 的值*temp,因此会出现分段错误。

而是尝试使用

char temp;
于 2013-11-06T05:58:01.940 回答