【发布时间】:2025-12-07 06:00:01
【问题描述】:
我这里有几行:
#include <stdio.h>
char *tolower(char *data)
{
char *p = data;
while(*p)
{
printf("nilai p : %c\n",*p);
if(*p >= 'A' && *p <= 'Z')
{
*p += ('a' - 'A');
}
p++;
}
return p;
}
int main()
{
char *a = "HajAR BleH";
char *b = tolower(a);
printf("nilai b : %s\n",b);
printf("nilai a - A : %d\n",'a' - 'A');
return 0;
}
下一步,编译,在 gdb 上运行,并跟踪分段
xxx@aaa:/tmp$ gcc -o aa aa.c --debug
xxx@aaa:/tmp$ gdb -q aa
Reading symbols from /tmp/aa...done.
(gdb) r
Starting program: /tmp/aa
nilai p : H
Program received signal SIGSEGV, Segmentation fault.
0x0804841e in tolower (data=0x804855e "HajAR BleH") at aa.c:11
11 *p += ('a' - 'A');
(gdb)
问题
1. 我认为*p += ('a' - 'A'); 将等于'H' += ('a' - 'A') 并等于72 += 32
但是,意外的分段错误,怎么会呢?
2.为什么要加('a' - 'A')让char/byte变低?
暂时就这些了,先谢谢了
【问题讨论】:
-
'a' - 'A' 没有意义,除非您熟悉 ASCII 表。 'a' 和 'A' 之间的数字差异是您必须添加到大写字母才能获得等效的小写字母。