关于最后一个printf语句,我有问题,为什么我们不能使用intarr打印显示出一些垃圾值的数组。
int main() {
int intArr[],*p,i,n;
scanf("%d",&n);
p=intArr;
p=(int *)malloc(n*sizeof(int));
for(i=0;i<n;i++)
{
scanf("%d",p+i);
}
for(i=0;i<n;i++)
{
printf("%d",intArr[i]);
}
return 0;
}
答案 0 :(得分:1)
也许您的意图是使用可变大小的数组,在读取n
后对其进行初始化:
// read 'n'
int n;
scanf("%d",&n);
// create an automatic (temporary) array of size 'n'
// which will be deallocated once it leaves scope
int intArr[n];
// this part is just making it harder for compiler to
// do static analysis - why not simply use `intArr`?
int * p = intArr;
但是由于您使用的是malloc
,因此根本不需要临时数组,而可以使用它:
// read 'n'
int n;
scanf("%d",&n);
// allocate an array of size 'n'
int * p = malloc(n * sizeof *p);
...
// release the memory
free(p);
答案 1 :(得分:0)
您的intArr[]
从未初始化。 malloc()
为p
提供一个新值,该值是它在第5行为其分配的内存插槽的地址:
p=intArr; // This is overridden
p=(int *)malloc(n*sizeof(int)); // by this
因此,对intArray
的任何进一步调用将产生不可预测的输出。
答案 2 :(得分:0)
问题来自:
p = intArr;
p = malloc(...);
这样做,p
的值在第二行丢失。
您应该写过
p = malloc(...);
intArr = p;
或
intArr = malloc(...);
p = intArr;
注意:
int intArr[];
不会编译(至少在gcc 8.3上)我认为您写过int *intArr;
-Wall
表示:
警告:“ intArr”在此功能中未初始化[-Wuninitialized]
答案 3 :(得分:0)
看看这个更正:
#include <stdio.h>
int main()
{
int *p,i,n;
scanf("%d",&n);
p=(int *)malloc(n*sizeof(int));
for(i=0;i<n;i++)
{
scanf("%d",p+i);
}
for(i=0;i<n;i++)
{
printf("%d\n",*(p+i));
}
return 0;
}
看到这可行,并且没有使用intArray的目的