如何在C中没有索引的情况下循环数组?

时间:2011-01-29 04:20:01

标签: c arrays pointers

我需要分配一个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 个答案:

答案 0 :(得分:2)

  1. for(; *array; array++);您最后应删除;
  2. 此循环的迭代次数未定义,您将丢失指针
  3. 你应该这样做:

    int *cur;
    for(cur = array; cur < array+n; ++cur)
    {
        *cur = ...;
    }
    

答案 1 :(得分:1)

如果你有一个数组int *a;,那么:

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

所以你可以通过对指针进行算术来完成数组。

答案 2 :(得分:1)

您使用*array作为条件,这意味着for循环应该继续,除非*array评估为false,这仅在*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

使用索引与操纵指针相同,否则你的教授就是荒谬的。

答案 3 :(得分:1)

当您分配内存时,您无法在内存中确定它的结束位置(除非您决定约定并在某处设置值,但无论如何您将使用 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++);
  }