C自动变量和内存地址

时间:2013-11-18 22:41:38

标签: c pointers memory-management

我在课程中被问到一个问题而且我不确定我是否正确地接近了这个问题。我们被指示编辑一个C文件以添加printf()语句,以打印变量值和指向变量的指针值。下面的评论表明我们应该做什么,随后的代码是我的工作。

#include <stdio.h>

int a = 0x13579753;
static int b = 0x24680864;

void foobar(int, int, int *, int *);

int main(void)
{
    static int c = 0xaaaa5555;
    int d = 0x5555aaaa;
    int *ap = &a;
    int *bp = &b;
    int *cp = &c;
    int *dp = &d;
    int array[1] = {0x01010101};

    /* add code here to print the address of array[0]  */
    printf("Automatic Variable array[0] = %p\n", &array[0]);

    /* add code here to print the variables a, b, c, d and pointers  */
    printf("Variable a = %x\n",a);
    printf("Variable b = %x\n",b);  
    printf("Variable c = %x\n",c);  
    printf("Variable d = %x\n",d);

    printf("Pointer to Variable a = %p\n",ap);
    printf("Pointer to Variable b = %p\n",bp);
    printf("Pointer to Variable c = %p\n",cp);
    printf("Pointer to Variable d = %p\n",dp);

    /* add code here to print array[i] for i = 0 to high enough value */
    int i;
    for ( i = 0; i < 6; i++)
        printf("Value of array[%d] = %x\n",i, array[i]);

    /* call subroutine foobar and pass arguments  */
    foobar(a, d, &a, &d);

    return;
}

void foobar(int x, int y, int *xp, int *yp)
{
    int array[1] = {0x10101010};

    printf("Entering foobar\n");

    /* add code here to print address of array[0]  */
    printf("array[0] = %p\n", &array[0]);

    /* add code here to print array[i] for i = 0 to high enough value */
    int i;
    for ( i = 0; i < 50; i++)
        printf("Value of array[%d] = %x\n",i, array[i]);    

    return;
}

然后我们应该看到,因为自动变量被分配了内存,因此内存中位置的地址应该减少。我知道变量“a”不是自动的,因为它在函数外部。我也知道“b”不是自动的,因为它是静态的,与c相同。变量“d”是自动的,a,b,c,d的所有4个指针都是自动的。

那么,如果我看一下“d”的内存地址然后4个指针,内存地址应该减少,我应该看到吗?

我似乎没有看到这一点。

任何帮助都表示赞赏。

谢谢, 克里斯

1 个答案:

答案 0 :(得分:0)

您混淆的原因是您正在查看指针的值,而不是指针本身的地址......所以您只查看单个自动变量的地址。如果你用以下代码替换指针printfs:

printf("Pointer to Variable a = %p\n",&ap);

(注意&ap)结果将是您所期待的。请注意,顺序可能是也可能不是您定义变量的顺序;这取决于编译器。