对指针和数组感到困惑

时间:2019-04-03 14:25:19

标签: c

关于最后一个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;
}

4 个答案:

答案 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;

注意:

  1. int intArr[];不会编译(至少在gcc 8.3上)我认为您写过int *intArr;
  2. 编译器应该警告您有关此问题的信息:gcc使用选项 -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的目的