好吧,我实际上是在看strcmp(),对它的工作感到困惑。无论如何我写了这段代码
#include <stdio.h>
main()
{
char a[5] = "ggod";
char b[5] = "ggod";
int c = 0;
c = b - a;
printf("%d value", c);
}
我输出
16
任何人都可以解释为什么它是16
?
答案 0 :(得分:3)
你减去的是没有两个字符串,而是两个char *
。 c
保存a
和b
之间的内存地址差异。这几乎可以是任意的。这只是意味着你在堆栈的第一个字符串的开头和第二个字符串的开头之间有16个字节的空间。
答案 1 :(得分:2)
c = b - a;
这是指针算术。它自己指向数组的起始地址的数组名称。 c
保留b
和a
指向的两个位置之间的差异。
当您使用%p
打印这些值时,您将了解您的情况
如果你打印的值看起来像这样一个== 0x7fff042f3710 b == 0x7fff042f3720
c= b-a ==>c=0x7fff042f3720-0x7fff042f3710=>c=0x10 //indecimal the value is 16
尝试打印
printf("%p %p\n",a,b);
c=b-a;
如果改变数组的大小差异将会改变
char a[120]="ggod";
char b[5]="ggod";
答案 2 :(得分:0)
b
是一个数组对象
a
也是一个数组对象
数组对象是数组的静态地址。
所以b-a
是两个地址之间的差异,而不是两个字符串之间的差异"ggod"-"ggod"
如果您想比较2个字符串,可以使用strcmp()
strcmp()
将返回0,如果2个字符串不同,则返回非0值
此处使用strcmp()