while()循环意外迭代

时间:2015-03-20 09:36:22

标签: c pointers while-loop

program
int main()
{
    int a=0xabcd;
    char *p=&a;
    while(p)
    {
        if(*p=='c')
        {
            printf("i got %c\n",*p);
            return; 
        }
        p++;
    }

}

1)为什么我总是得到像"我得到c" 的答案。

2)无论我执行多少次这个程序,为什么我得到%c作为c 3)用任何字符替换c字符,无论如何,为什么我们得到这样一个字符,如果条件,我们放入什么?

if(*p=='z') or if(*p=='t') or .... 

4)任何人都可以解释原因是什么?

4 个答案:

答案 0 :(得分:5)

    32位计算机上的
  • int a=0xabcd将为您提供0x0000abcd。如果您尝试将此整数的内容作为字符读取,则根据字节顺序,您将获得0x00或0xcd。也不是可打印的ASCII字符。这没有任何意义。

  • while(p)表示"而p指向的地址不为零"。这没有任何意义。因此,您继续循环并读取分配的整数之外的随机存储器单元。任何事情都可能发生。如果运气好的话,程序会崩溃。

总而言之,您似乎并不完全知道自己在做什么......

答案 1 :(得分:2)

1)你得到i got c,因为你的程序有一个指针p,它指向0xabcd的每个字节,按顺序和超出!在某些时候,指针将指向字节0x63,即' c'。由于这是if条件,print语句打印 p 指向的char,您会看到消息i got c

2)因为if条件仅在 p 指向的字节为0x63时才执行print语句,因此' c'。这就是您始终看到相同消息的原因。但请注意,只有在内存中某处有值为0x63的字节时,它才有效。

3)你会这样写它来显示其他字符。

if((*p=='z') || (*p=='t') || ....) 

4)见上面的答案。

答案 2 :(得分:1)

除了 @Lundin 先生的好回答,只是为了澄清 print 的逻辑,

  

1)为什么我总是得到一个像“我得到c”的答案。

因为,您编写了代码来执行此操作。如果您检查逻辑,请远离程序错误,您编写代码,以便只有printf()的值等于*p时才会执行c。所以,难怪,printf()(如果遇到)将一直打印

i got c

接下来,

  

2)无论我执行此程序多少次,为什么我将%c作为c。

正确。与上述原因相同。

  

3)用任何字符替换c字符,无论如何,为什么我们得到这样一个字符,如果条件我们放入什么?。

如果<{em> printf()条件满足,则if只会执行。因此,无论您在if条件中使用哪种字符,printf()都只会打印该字符。

答案 3 :(得分:1)

你似乎不知道自己在做什么。

最近的工作问题看起来像这样:

#include <stdio.h>

int main()
{
    int a[2] = {0x0a0b0c0d, 0};
    char *p = (char *) a;

    while (*p)
    {
        if (*p == 0x0c)
        {
            printf("i got c\n");
            return 0; 
        }
        p++;
    }

}

或另一个更好的解决方案:

#include <stdio.h>

int main()
{
    int a = 0x0a0b0c0d;

    for (int i = 0; i < sizeof (int); i++)
    {
        if(((char *) &a)[i] == 0x0c)
        {
            printf("i got c\n");
            return 0; 
        }
    }

}