有人可以向我解释为什么使用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
答案 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