使用字符指针崩溃;使用普通字符不会崩溃——但为什么呢?

标签 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--;
    }
}

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

最佳答案

当您使用 char *temp; 和:

*temp = *end;

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

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

关于使用字符指针崩溃;使用普通字符不会崩溃——但为什么呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19805013/

相关文章:

c - 使用 ioctl 将多个 ipv6 地址添加到单个接口(interface)

c - 为什么scanf需要&?

c++ - 删除队列对象数组

c - 更新到 OpenSSL 0.9.8.zf 后出现 "bad packet length"错误

mysql - 连接 MySQL 和 C

c++ - 为什么字符串文字中的值会发生变化

c++ - 使用C++动态分配多维结构数组

c - 如何在执行 2 个单链表的添加时克服段错误?

c - 为什么我收到段错误 : 11 on the program below

c - 链接列表打印问题?