c程序 - 为什么以8h的间隔存储整数,即使它们占用4个字节

时间:2017-06-14 13:59:03

标签: c memory int

有人可以向我解释为什么使用ints的用户收到的scanf()存储在8h分开的地址中,即使int的大小也是如此在我的64位机器上4字节?它与内存中的对齐?

#include <stdio.h>
void main() {

    int *a;
    int i, n;



    printf(" Input the number of elements to store in the array : ");
    scanf("%d",&n);

    printf(" Input %d number of elements in the array : \n",n);

    printf("size of on int is %d\n", sizeof(i));

    for(i=0;i<n;i++) {
        printf(" element - %d : ",i+1);
        printf("address of a is %p\n", &a+i);
        scanf("%d",a+i);
    }

   return 0;

}


 Input the number of elements to store in the array : 3
 Input 3 number of elements in the array : 
size of on int is 4
 element - 1 : address of a is 0x7ffda5cf8750
6
 element - 2 : address of a is 0x7ffda5cf8758
5
 element - 3 : address of a is 0x7ffda5cf8760
2

1 个答案:

答案 0 :(得分:5)

#include <stdio.h>
void main() {

    int *a;
    int i, n;

您是否遗漏了以下代码?如果没有,a现在是一个具有不确定值的未初始​​化指针。

    printf("address of a is %p\n", &a+i);

您可以使用a运算符获取&地址。结果是指向a 的指针,IOW指向指针的指针。 64位系统上指针的大小为8,所以这应该回答你的问题。

    scanf("%d",a+i);

在这里你写一些“随机”内存位置。这是未定义的行为

供您参考,您似乎想要做的固定程序:

#include <stdio.h>
#include <stdlib.h> // <- needed for malloc()/free()

// use a standard prototype, void main() is not standard:
int main(void) {

    int *a;
    int i, n;

    printf(" Input the number of elements to store in the array : ");
    if (scanf("%d",&n) != 1)
    {
        // check for errors!
        return 1;
    }

    // allocate memory:
    a = malloc(n * sizeof(int));

    for(i=0;i<n;i++) {
        printf(" element - %d : ",i+1);
        if (scanf("%d", a+i) != 1)
        {
            // again, check for errors!
            return 1;
        }
    }

    // [...]

    // when done, free memory:
    free(a);

    return 0;
}

要了解如何更有力地进行输入,请阅读scanf()fgets()strtol()上的文档......我准备了a little document,但有很多在线提供的其他资源,例如this FAQ on SO