我在类(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/