我正在尝试学习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()(除非你不关心内存泄漏).