c-这个字符串比较程序如何适用于相同大小的字符串



我们的教授给了我们下面的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个字节长。尽管如此,函数比较更多,在这种情况下,字节太多。由于字符串后面的内存包含不同的值,因此报告字符串不相等。

最新更新