Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 对于相同大小的字符串,这个字符串比较程序是如何工作的?_C_String_Pointers_Type Conversion - Fatal编程技术网

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

我们的教授给了我们下面的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,  %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
假设您的系统使用32位整数和小尾数,这些字节被解释为整数:

  • “直升机”:0x68 0x65 0x6C 0x6F 0x00:0x6F6C6568=1869374824
  • “帮助”:0x68 0x65 0x6C 0x70 0x00:0x706C6568=1886152040
要查看限制,请尝试比较以下字符串:

  • “hello dear”和“hello pal”=>将在32位整数系统上报告为相等
  • 根据系统的不同,“a”和“a”=>可能会被报告为不相等
  • “真的,真的很长”和“真的,真的很长,甚至更长”=>将在任何通用系统上报告为相等
回答你的具体问题

为什么在对char指针进行类型转换并取消引用后,该值会发生变化

该值不会因类型转换而更改。价值的解释发生了变化。这是类型转换的目的之一

编辑:

为什么
在某些系统或环境中比较(“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上运行良好。