Как пролистать массив без индексов в C? - PullRequest
1 голос
/ 29 января 2011

Мне нужно выделить массив размера N и присвоить ему значения, как я могу сделать это без int-индексов?

Вот код, который у меня есть, но он не делает то, что мне нужно:

#include <stdlib.h>
#include <stdio.h>

int main() {
    int *array;
    int n;

    printf("Size of array: ");
    scanf("%d", &n);
    array = (int*) malloc(n*sizeof(int));
    if (array == NULL) printf("Memory Fail");

    for(; *array; array++)
    {
        printf("Store:\n");
        scanf("%d", &n);
        *array = n;
    }

    for(; *array; array++)
    {
        printf("Print: %d\n",*array);
    }

    free(array);
    return 0;
}

спасибо

Ответы [ 4 ]

2 голосов
/ 29 января 2011
  1. for(; *array; array++); вы должны удалить ; в конце
  2. Число итераций для этого цикла не определено, и вы потеряете указатель

Вы должны сделать что-то вроде этого:

int *cur;
for(cur = array; cur < array+n; ++cur)
{
    *cur = ...;
}
1 голос
/ 29 января 2011

Вы используете *array в качестве условия, что означает, что цикл for должен продолжаться, пока *array не станет ложным, что только если *array == 0.Вы фактически вызываете неопределенное поведение, потому что вы выделяете array с помощью malloc и пытаетесь разыменовать указатель, когда базовые данные могут быть чем угодно, так как блок данных был неинициализирован.

Вам все еще нужен какой-то типсчетчика для цикла, в этом случае вы выделили n элементов.

/* I'm using a C99 construct by declaring variables in the for initializer */
for (int i = 0; i < n; ++i)
{
    /* In your original code you re-assign your counter 'n', don't do that otherwise you lost the size of your array! */
    int temp; 
    printf("Store: \n");
    scanf("%d", &temp)
    array[i] = temp;
}

/* This is your second loop which prints the items */
for (int i = 0; i < n; ++i)
{
    printf("%d\n", array[i]);
}

Кроме того, не манипулируйте указателем array, не сохраняя его копию. Вы можете использовать free только для указателя, возвращенного malloc.

Использование индексов - это то же самое, что манипулирование указателем, в противном случае ваш профессор будет смешным.

1 голос
/ 29 января 2011

Когда вы распределяете память, у вас нет возможности определить в памяти, где она заканчивается (если вы не решите соглашение и не установите какое-либо значение, но в любом случае вы будете использовать n ).

В вашем случае вы должны использовать n , чтобы ограничить покрытие массива (в противном случае оно ограничивается только мощностью вашего компьютера и до тех пор, пока не достигнет области, к которой у него нет доступа: программаавария).Например (будьте осторожны, чтобы не перезаписать n !)

  int v;
  int x = n;
  int *ptr = array;
  while (x--) 
  {
    printf("Store:\n");
    scanf("%d", &v);
    *ptr++ = v;
  }

  x = n;
  ptr = array;
  while (x--)
  {
    printf("Print: %d\n",*ptr++);
  }
1 голос
/ 29 января 2011

Если у вас есть массив int *a;, тогда:

a[0] is equal to *a
a[1] is equal to *(a+1)
a[2] is equal to *(a+2)

Таким образом, вы можете пройти через массив, выполнив арифметику с указателем.

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