Y不递增

时间:2011-03-29 06:10:56

标签: c

这是该计划:

#include<stdio.h>  

void main() {
    int *x,*y;
    int a=23,b=56;

    x=&a;
    y=&b;

    printf("%d\t%d",x,y);

    x++;
    y++;

    /* here only x is incremented but y remains same. What is the reason? */
    printf("\n%d\t%d",x,y);
}

,即x增加2.但是y保持不变。怎么样?

6 个答案:

答案 0 :(得分:11)

没有保证您的指针与整数的大小相同,因此您不应该使用%d作为格式说明符。

当人们将long个变量传递给printf并使用int的说明符时,我发现了类似的问题。因为长度比int宽,所以它混淆了printf关于堆栈中事物的位置。

您应该使用%p作为指针。标准方面,该代码还存在许多其他问题。尝试以下作为起点:

#include <stdio.h>

int main (void) {
    int *x, *y;
    int a = 23, b = 56;

    x=&a; y=&b;
    printf ("%p  %p\n", x, y);

    x++; y++;
    printf ("%p  %p\n", x, y);

    return 0;
}

这是一个可能的解释(感谢Michael Burr的评论):

假设您的指针是32位,整数是16位,并且您使用的是小端架构(如英特尔)。

此外,假设a的地址为0x12345678b的地址为0x1234567a

当您将它们传递给printf时,您会在堆栈上推送两个32位值,但printf只读取两个16位值,因为它已被告知%d %d格式指示符:

       himem
      --------
    / | 0x12 |
push  | 0x34 |
   |  | 0x56 |
    \ | 0x78 |
      --------
    / | 0x12 | \ printf reads 0x1234
push  | 0x34 | /
   |  | 0x56 | \ printf reads 0x567a
    \ | 0x7a | /
      --------
       lomem

然后,当你增加两个指针并再次调用printf时,你得到:

       himem
      --------
    / | 0x12 |
push  | 0x34 |
   |  | 0x56 |
    \ | 0x7a |
      --------
    / | 0x12 | \ printf reads 0x1234
push  | 0x34 | /
   |  | 0x56 | \ printf reads 0x567c
    \ | 0x7c | /
      --------
       lomem

所以你可以在那个场景中看到为什么它看起来好像只有一个指针已经递增但真正的问题是你不是打印指针,而是你打印的最多他们中的一半(可能不会改变)和同一个中最不重要的一半(将改变)。

答案 1 :(得分:0)

怎么样...... int * x; int * y; 而不是int * x,* y;

答案 2 :(得分:0)

嗨,你增加你的指针地址而不是值使用(*x)++ (*y)++

答案 3 :(得分:0)

在您的代码中,您正在访问指针并递增指针。您可能想要做的是:

void main() {
  int *x,*y;
  int a=23,b=56;
  x=&a;
  y=&b;
  printf("%d\t%d",*x,*y);
  (*x)++;
  (*y)++;
  printf("\n%d\t%d",*x,*y);
  return 0;
}

注意(* x)++和(* y)++访问指针的,因为就是这样,你要增加。如果您编写x ++或y ++,则会增加指针本身,这意味着您将地址推到指向前方的位置。这导致您的情况出现未定义的值。

答案 4 :(得分:0)

你正在递增指针,而不是值,如果有任何帮助的话。

我不能告诉你更多,因为那个来源实际上并没有编译,并且给你的警告大致相同:)

#include<stdio.h>
int main(int argc, char *argv[]) {
        int *x,*y;
        int a=23,b=56;
        x=&a;
        y=&b;
        printf("%d\t\t%d",*x,*y);
        x++;
        y++;
        printf("\n%d\t\t%d",*x,*y);
        return 0;
}

将编译并显示内容 - 在我的编译器上产生以下输出:

23      56
1606415920      23

(我在每行放两个'\ t'以保证值​​的分离,这不会影响其余的代码)

因为我假设你希望代码增加ab代码如下:

#include<stdio.h>
int main(int argc, char *argv[]) {
        int *x,*y;
        int a=23,b=56;
        x=&a;
        y=&b;
        printf("%d\t\t%d",*x,*y);
        (*x)++;
        (*y)++;
        printf("\n%d\t\t%d",*x,*y);
        return 0;
}

打印:

23      56
24      57

答案 5 :(得分:0)

请程序:

#include<stdio.h>
void main() {
    int *x= NULL;
    int *y = NULL;
    int a=23,b=56;
    x=&a;
    y=&b;
    printf("%x\t%x",x,y);
    x++;
    y++;
    printf("\n%x\t%x",x,y);
}

我认为应该没问题。只有这些值才能正确初始化。