#include<stdio.h>
#include<stdlib.h>
int main ()
{
int a,n;
int * ptr_data;
printf ("Enter amount: ");
scanf ("%d",&a);
int arr[a];
ptr_data = (int*) malloc ( sizeof(int) );
for ( n=0; n<a; n++ )
{
printf ("Enter number #%d: ",n);
scanf ("%d",&ptr_data[n]);
}
for ( n=0; n<a; n++ )
arr[n] = ptr_data[n]; //values in heap are copied to an array.
printf("%d\n",sizeof(ptr_data));
free (ptr_data);
printf ("Output: ");
for ( n=0; n<a; n++ )
printf("%d\n",arr[n]);
return 0;
}
sizeof函数将指针的大小打印为4(整数的大小)。但是我运行一个循环来获取要存储在堆中的值(scanf,。),那么这个后续的指针指针映射是如何在第一次之后发生的?就像在第一次我明确编码ptr_data包含大小4.但在那之后,当我想存储另一个整数时,这个指针显示另一个随机内存引用(这个映射解释是我想要的。)
答案 0 :(得分:1)
您的代码中包含的是未定义的行为。
ptr_data = (int*) malloc ( sizeof(int) );
分配内存,相当于堆上单个整数的大小,ptr_data
指向此分配的内存。此外,
for ( n=0; n<a; n++ )
{
printf ("Enter number #%d: ",n);
scanf ("%d",&ptr_data[n]);
}
写入超出分配内存的范围:
ptr_data[n];
相当于:
*(ptr_data + n);
请注意,写入超出属于您的内存范围会导致C和C ++中的未定义行为。对于未定义的行为,程序不需要以任何特定方式运行。许多工作正常或崩溃或显示任何随机行为,简单的行为是未定义的。
答案 1 :(得分:0)
行ptr_data = (int*) malloc ( sizeof(int) )
仅为一个整数指针分配内存。您正在尝试为ptr_data
分配多个值。如果你想这样做,那么:
ptr_data = malloc (sizeof(int) * a);
这将为int a
整数提供指针空间。