我一直在做一个项目,我花了最后一小时试图找到我的代码中的错误。经过仔细检查后,我发现一些奇怪的东西一直都是问题。
我的数组的初始元素的地址奇怪地与memcmp()
相等。我已经分离了我的代码并尝试了一个测试代码,我得到了类似的结果。有人可以解释这种奇怪的行为吗?
#include <stdio.h>
#include <string.h>
int main(void)
{
char buf[256];
char *p1 = buf;
char *p2 = buf + 3;
if (memcmp(p1, p2, sizeof(char *)) == 0) {
puts("equal...");
}
p1 = buf + 100;
p2 = p1 + 3;
if (memcmp(p1, p2, sizeof(char *)) == 0) {
puts("equal...");
}
return 0;
}
答案 0 :(得分:2)
您有未定义的行为。
本地变量,无论是简单的整数还是数组,都没有初始化。它们的价值是不确定。在初始化之前以任何方式使用它们,甚至从它们读取都会导致未定义的行为。
此外,您不是在比较两个字符,而是一次比较4个或8个字符,具体取决于您是否使用32位或64位系统。如果要比较单个字符,则应使用sizeof(char)
(指定始终等于1
)。你也没有比较指针,你正在比较它们指向的东西。
如果您想比较两个单个字符,请使用比较等于运算符==
,例如*p1 == *p2
或明显buf[0] == buf[3]
。
答案 1 :(得分:1)
memcmp
不会比较地址。它比较了记忆。
int memcmp(const void *s1, const void *s2, size_t n);
memcmp
比较n
和s1
的前s2
个字节,看它们是否相等。
在这里,你有
if (memcmp(p1, p2, sizeof(char *)) == 0) {
sizeof(char *)
将成为您的指针大小,可能是4或8,具体取决于您的架构。
这意味着您正在比较以查看p1和p2的第一个sizeof(char *)
字节是否相等。由于你从来没有初始化这些数据,所以会发生几乎随机的事情。我假设你的实际代码将它归零,这很容易解释为什么它总是比较相等。
答案 2 :(得分:0)
在调试器中运行代码并检查buf的内容是什么。 某些编译器在调试模式下将数组中的所有项清零,并在发布版本中为它们提供不确定的值。 或者在发布版本中运行代码并检查它们是否相等
答案 3 :(得分:0)
我认为memcmp()
会比较内存中存在的内容而不是您传递的指针。如果要比较指针(地址),请将指针和大小的指针传递给sizeof(1)
因此修改了您的问题代码
/* to compare addresses */
/* simple one */
if(p1 == p2)
/* redundant one */
if(!memcmp(&p1, &p2, sizeof(p1))
答案 4 :(得分:0)
您正在尝试比较指针变量p1
和p2
的4字节内容。但是,您实际上是在比较p1
和p2
指向的4个字节,因为这是memcmp
所做的。
memcmp
的前两个参数是您要查看的数据的内存地址,变量的内存地址通过在变量之前使用&
运算符来指示。
你想要
memcmp(&p1, &p2, sizeof(char*));