为什么初始数组元素的地址比较相等?

时间:2016-07-23 07:19:58

标签: c arrays pointers memcmp

我一直在做一个项目,我花了最后一小时试图找到我的代码中的错误。经过仔细检查后,我发现一些奇怪的东西一直都是问题。

我的数组的初始元素的地址奇怪地与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;
}

5 个答案:

答案 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比较ns1的前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)

您正在尝试比较指针变量p1p2的4字节内容。但是,您实际上是在比较p1p2指向的4个字节,因为这是memcmp所做的。

memcmp的前两个参数是您要查看的数据的内存地址,变量的内存地址通过在变量之前使用&运算符来指示。

你想要

memcmp(&p1, &p2, sizeof(char*));