程序正确执行,然后是段错误

Fer*_*s 2 c

我正在尝试学习C编程,并花了一些时间练习指针今天早上,通过编写一个小函数来将字符串中的小写字符替换为大写字母.这就是我得到的:

#include <stdio.h>
#include <string.h>

char *to_upper(char *src);

int main(void) {
    char *a = "hello world";
    printf("String at %p is \"%s\"\n", a, a);
    printf("Uppercase becomes \"%s\"\n", to_upper(a));
    printf("Uppercase becomes \"%s\"\n", to_upper(a));
    return 0;
}

char *to_upper(char *src) {
    char *dest;
    int i;
    for (i=0;i<strlen(src);i++) {
        if ( 71 < *(src + i) && 123 > *(src + i)){
            *(dest+i) = *(src + i) ^ 32;
        } else {
            *(dest+i) = *(src + i);
        }
    }
    return dest;
}
Run Code Online (Sandbox Code Playgroud)

这样可以正常运行并打印出应有的内容(包括重复"HELLO WORLD"行),但之后以Segmentation故障结束.我无法理解的是,该功能正在清楚地编译,执行和返回成功,并且主流继续.那么分段错误发生在return 0

Gre*_*ill 18

dest在你的to_upper()功能中没有初始化.所以,当你这样做时,你会覆盖一些随机的内存部分,显然这会导致程序在你尝试返回时崩溃main().

如果要修改该值,请初始化dest:

char *dest = src;
Run Code Online (Sandbox Code Playgroud)

如果要复制值,请尝试:

char *dest = strdup(src);
Run Code Online (Sandbox Code Playgroud)

如果你这样做,你需要确保有人调用free()返回的指针to_upper()(除非你不关心内存泄漏).