复制int片段后的等式检查

时间:2016-05-16 20:42:38

标签: c pointers

众所周知,未初始化的局部变量具有不确定的值,使用它会调用未定义的行为。但是,使用指针复制片段以及之后检查相等性等操作是否会导致未定义的行为?

以下编译并顺利运行,但我不确定。

#include <stdio.h>
#include <string.h>

int main()
{
    int p;
    int q = 1;

    char *_p = (char *)&p;
    char *_q = (char *)&q;

    size_t n;
    for(n = 0; n < sizeof(int); n++) {
        memcpy(_q++, _p++, sizeof(char));
    }

    if (p == q) {
        printf("Equal!!!\n");
    }

    return 0;
}

2 个答案:

答案 0 :(得分:1)

您正在初始化的内存中复制未初始化的内存。最终结果是两个存储器位置的内容将是相同的,因此匹配。由于来源未经初始化,其价值无法得到保证;一旦将此值复制到先前初始化的值上,您就会清除设置的内容并将其替换为未知值。

因此他们会匹配。

虽然你的复制程序有点过分,但我想你已经意识到这一点并纯粹用它来进行实验:)

答案 1 :(得分:0)

要跟进@Jonathan,您不是在处理未定义的行为,而是处理未定义的值。未定义的值被复制得很好。

如果您尝试执行除以未定义值(可能为零)之类的操作,将会出现什么情况。或者更糟糕的是,通过未定义的指针分配值。

    int *p;
    int q = 1;

    char *p = q;

尝试以后你可以很好地分割错误,如果你不这样做,你可能会走过一些随机的记忆位置;在小型,短命的节目中经常没有注意到,但对于大型,长寿的节目而言,这是一个可怕的问题。

开启积极的编译器检查可能会遇到简单的情况。更加模糊的案例提出了严峻的调试挑战。