C 自动变量和内存地址

标签 c pointers memory-management

我在类(class)中被问到一个问题,我不确定我是否正确处理了这个问题。我们被指示编辑一个 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 个指针,那么我是否应该看到内存地址应该减少?

我好像没看到这个。

非常感谢任何帮助。

谢谢, 克里斯

最佳答案

您感到困惑的原因是您正在查看指针的值,而不是指针本身的地址......所以您只查看单个自动变量的地址。如果您要将指针 printfs 替换为:

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

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

关于C 自动变量和内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20059523/

相关文章:

c - 初始化一个具有结构体的队列

c - 如何在 gcc make 中链接静态库?

c - 为什么 _itoa 导致我的程序崩溃?

c - 读取套接字缓冲区未读取

c++ - 通过共享指针生成不同继承类的实例

c++ - 将指向 reference_wrapper 的指针转换为指向底层的指针?

ios - 加载图像会导致内存激增

c - 指向 C 中数组的指针 : Address Arithmetic and Array Assignment

swift - 闭包在定义或首次调用时是否分配内存?

c - Pebble 在 `realloc` 上崩溃,但仅在特定函数中崩溃