使用字符指针崩溃;没有使用简单字符崩溃 - 但为什么?

时间:2013-11-06 05:47:29

标签: c pointers

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

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 *temp更改为char 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--;
    }
}

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

3 个答案:

答案 0 :(得分:2)

使用char *temp;和:

*temp = *end;

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

  • 使用不会崩溃的版本。
  • 当您使用指针时,请始终确保您知道它指向的是什么。

答案 1 :(得分:2)

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

*temp = *end;

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

请改用char。像:

char temp;

此外,您需要1 char小于字符串的长度,以便忽略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--;
    }
}

以下是full program

答案 2 :(得分:1)

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

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

*temp没有指向任何地方。

内存未分配给char *temp,而您试图在*end中存储*temp的值,因此会产生分段错误。

而是尝试使用

char temp;