我们的教授给了我们下面的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("%c, %cn%d, %dn", *a, *b, *pa, *pb);
printf("%dn", *pa == *pb);
我得到这个:
h, h
1869374824, 1886152040
0
为什么在对char指针进行类型转换并取消引用后,值会发生变化?
只要int
在目标系统上,给定函数仅适用于字符串。(然而,这还有更多的微妙之处。(
记忆内容的意义只是由上下文决定的。如果你在程序中说,一些单元格形成了一个字符数组,它将被解释为这样。如果相同的存储单元形成一个整数,那么它将被解释为整数。
现在让我们看看您的例子:
"helo";是一个由5个字符组成的字符串,即"h"、"e"、"l"、"o"one_answers"\0"。
"帮助;是一个由5个字符组成的字符串,即"h"、"e"、"l"、"p"one_answers"\0"。
在十六进制字节中,假设它们是ASCII:
- "helo":0x68 0x65 0x6C 0x6F 0x00
- "帮助":0x68 0x65 0x6C 0x70 0x00
假设您的系统使用32位整数和小字节序,这些字节被解释为整数:
- "helo":0x68 0x65 0x6C 0x6F 0x00:0x6F66568=1869374824
- "帮助":0x68 0x65 0x6C 0x70 0x00:0x706C6568=1886152040
要查看限制,请尝试比较以下字符串:
- "你好亲爱的"以及";你好,朋友">将在32位整数系统上报告为相等
- "a";以及";a"=>可能会被报告为不平等,具体取决于系统
- "真的,真的很长";以及";真的,真的很长,甚至更长"=>将在任何通用系统中报告为平等
回答您的特定问题
为什么在对char指针进行类型转换并取消引用后值会发生变化?
该值不会因类型转换而更改。对价值的解释发生了变化。这就是类型转换的目的之一。
编辑:
为什么CCD_ 2返回";0";(false
(在某些系统或情况下?
试试这个小例子:
#include <stdio.h>
int compare(char *a, char *b)
{
int *pa = (int *)a;
int *pb = (int *)b;
return *pa == *pb;
}
int main(void)
{
static char a[] = "a";
char b[2];
b[0] = 'a';
b[1] = ' ';
printf("a = "%s", b = "%s", compare gives %dn", a, b, compare(a, b));
return 0;
}
结果将是:
a = "a", b = "a", compare gives 0
这是因为比较了4或8个字节,但字符串a
和字符串b
只有2个字节长。尽管如此,函数比较更多,在这种情况下,字节太多。由于字符串后面的内存包含不同的值,因此报告字符串不相等。