C 对于相同大小的字符串,这个字符串比较程序是如何工作的?
我们的教授给了我们下面的C代码来比较两个相同大小的字符串,我不明白它是如何工作的C 对于相同大小的字符串,这个字符串比较程序是如何工作的?,c,string,pointers,type-conversion,C,String,Pointers,Type Conversion,我们的教授给了我们下面的C代码来比较两个相同大小的字符串,我不明白它是如何工作的 int compare(char *a, char *b) { int *pa = (int *)a; int *pb = (int *)b; return *pa == *pb; } 当我有以下两个字符串时: char*a=“你好”; char*b=“你好” 程序输出1,没有异常 char*a=“helo”; char*b=“帮助” 程序输出0。这是怎么发生的?我试图打印出以下内容: printf(&q
int compare(char *a, char *b)
{
int *pa = (int *)a;
int *pb = (int *)b;
return *pa == *pb;
}
当我有以下两个字符串时:
char*a=“你好”;
char*b=“你好”
程序输出1,没有异常
char*a=“helo”;
char*b=“帮助”
程序输出0。这是怎么发生的?我试图打印出以下内容:
printf("%c, %c\n%d, %d\n", *a, *b, *pa, *pb);
printf("%d\n", *pa == *pb);
我明白了:
h, h
1869374824, 1886152040
0
键入字符指针并取消引用后,值为什么会发生变化?只要目标系统上有
int
,给定函数仅对字符串有效。(不过,这还有更多微妙之处。)
记忆内容的意义只取决于上下文。如果你在你的程序中说,一些单元格形成一个字符数组,它将被解释为这样。如果相同的存储单元形成一个整数,则会将其解释为整数
现在让我们看一下您的示例:
“helo”是由5个字符组成的字符串,“h”、“e”、“l”、“o”和“\0”
“帮助”是由5个字符组成的字符串,“h”、“e”、“l”、“p”和“\0”
以十六进制字节表示,假设它们是ASCII:
- “直升机”:0x68 0x65 0x6C 0x6F 0x00
- “帮助”:0x68 0x65 0x6C 0x70 0x00
- “直升机”:0x68 0x65 0x6C 0x6F 0x00:0x6F6C6568=1869374824
- “帮助”:0x68 0x65 0x6C 0x70 0x00:0x706C6568=1886152040
- “hello dear”和“hello pal”=>将在32位整数系统上报告为相等
- 根据系统的不同,“a”和“a”=>可能会被报告为不相等
- “真的,真的很长”和“真的,真的很长,甚至更长”=>将在任何通用系统上报告为相等
在某些系统或环境中比较(“a”,“a”)
返回“0”(false
)
试试这个小例子:
#包括
整数比较(字符*a,字符*b)
{
int*pa=(int*)a;
int*pb=(int*)b;
返回*pa==*pb;
}
内部主(空)
{
静态字符a[]=“a”;
charb[2];
b[0]=“a”;
b[1]='\0';
printf(“a=\%s\”,b=\%s\,比较给出%d\n”,a,b,比较(a,b));
返回0;
}
结果将是:
a = "a", b = "a", compare gives 0
这是因为比较了4个或8个字节,但是字符串
a
和字符串b
一样只有2个字节长。然而,函数比较多,在这种情况下字节太多。由于字符串后面的内存包含不同的值,因此报告字符串不相等。因为您的环境中int
占用4个字节,而char
占用1个字节?请使用char*a=“hello”进行尝试;char*b=“hellp”代码>。它只识别前4个字符中的差异。这一点表达得很清楚。谢谢你的解释。此外,我们是否可以通过使用较长字节大小的数据类型(可能是双倍或长字节)来增加相似性范围?您可以尝试一下,然后就可以了。然而,想想“a”对“a”的例子,为什么它会给出错误的结果。最后,你教授的例子很好地介绍了内存解释,但作为代码它是垃圾。尽管有些系统对对齐很挑剔。请使用你最喜欢的网络搜索引擎搜索“对齐”、“端点”等技术术语。你能解释一下“a”和“a”在什么情况下会断裂吗?它在我的64位pc上运行良好。