Запутаться в указателе и массивах - PullRequest
0 голосов
/ 03 апреля 2019

У меня проблема с последним оператором 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 ]

1 голос
/ 03 апреля 2019

Возможно, вы намеревались использовать массив переменного размера, инициализируя его после прочтения 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);
0 голосов
/ 03 апреля 2019

посмотрите на это исправление:

#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

0 голосов
/ 03 апреля 2019

Проблема возникает из:

p = intArr;
p = malloc(...);

При этом значение p теряется во второй строке.

Вы должны были написать

p = malloc(...);
intArr = p;

или

intArr = malloc(...);
p = intArr;

Примечание:

  1. Запись int intArr[]; не компилируется (по крайней мере, в gcc 8.3) Я предполагаю, что вы написали int *intArr;
  2. Компилятор должен предупредить вас о проблеме: с опцией -Wall, gcc говорит:

    предупреждение: "intArr" используется неинициализированным в этой функции [-Wuninitialized]

0 голосов
/ 03 апреля 2019

Ваш intArr[] никогда не инициализируется. malloc() дает p новое значение, которое является адресом слота памяти, выделенного для него в строке 5:

p=intArr;                       // This is overridden
p=(int *)malloc(n*sizeof(int)); // by this

Таким образом, любой дальнейший вызов intArray приведет к непредсказуемому результату.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...