【问题标题】:Not declaring array size in C未在 C 中声明数组大小
【发布时间】:2012-07-14 14:57:51
【问题描述】:

考虑一下这个简单的 Python 程序:

n=int(input("enter your lower limit"))
m=int(input("enter your higher limit"))
list=[]
x=n
while x<=m:
    if (x%2==0):
        list.append(x)
    x+=1
print("the even numbers in your range are:",end="")
print(len(list))

在这里,我最初可以将列表的元素声明为空,并继续在其中插入结果,其范围完全取决于用户。然后我可以检查该列表的长度,因此在用户范围之间有多少元素满足我的条件。所以在 Python 中它变得很容易!

但在 C 中,我必须首先声明数组的元素数!我可以将它声明为一个随机的大数,然后继续插入结果。然后通过检查字符\0之前有多少元素来找出最终结果(在用户范围内有多少元素满足我的条件)。但它仍然会浪费大量内存并在未使用的元素中保留垃圾,这可能会导致更大的程序出现问题!

好吧!我对malloc() 了解一些。但我也必须在这里声明尺寸!虽然我可以稍后释放内存,从而减轻更大程序的压力,但我真的想知道 C 语言中是否存在像 Python 这样的简单过程?

【问题讨论】:

  • realloc,您可以实现链表或其他此类“高级”数据结构。仅此而已,在标准 C 中没有什么比向量更重要的了。
  • 在这种情况下,您知道mn,并且您将在 50% 的情况下追加,因此提前计算列表需要多大是微不足道的。为什么不只对 malloc 或数组大小这样做​​呢?即使您不知道要追加 50%,您仍然可以计算插入次数的上限。
  • 好吧..这只是一个例子......如果我不知道其他情况下的大小,我能做什么这是我的问题!
  • @NasifImtiazOhi - 关键是“不知道大小”非常罕见,“根本不知道任何事情”的可能性更小 - 更好的解决方案是使用尽可能提供给您的信息。例如,您可以非常便宜地进行两次传递,一次计算大小,另一次在知道大小后存储它。

标签: python c arrays element


【解决方案1】:

您需要一个动态数据集,例如动态分配的数组。您可以使用malloccalloc 创建初始数组,并使用realloc 更改其大小。但请注意测试是否成功:

Foo * array = calloc(25, sizeof(Foo));         // space for 25 Foo's, zeroed out
// test for "array != NULL"                    // "25" can be a dynamic value

// use array[0], array[1], ..., array[24]


Foo * tmp = realloc(array, 250 * sizeof(Foo)); // extend to 250 elements
if (tmp) { array = tmp; }
else     { /* error! */ }

// use ... array[249]


free(array);                                   // clean up

或者,您可以实现任何其他动态数据结构,例如链表或树,并分别为每个元素(每个 节点)分配/释放空间并以某种方式跟踪它们.连续数组只是最简单直接的动态数据结构,但它适用于很多场景。

【讨论】:

  • Umm... array = tmp 不会复制旧数组的数据。你需要做类似for(i=0; i&lt;25; i++) { tmp[i] = array[i]; }
  • @Dubslow: array = tmp 是一个指针赋值,故意的。
  • 这就是我的观点。这样做会丢失数组中的所有数据(并造成内存泄漏),这肯定不是任何人想要的。
【解决方案2】:

你可以使用Linked List,或者你可以调整数组的大小,这样你就可以让它动态增长。只是一个基本的想法:

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

struct list_el {
   int val;
   struct list_el * next;
};

typedef struct list_el item;

void main() {
   item * curr, * head;
   int i;

   head = NULL;

   for(i=1;i<=10;i++) {
      curr = (item *)malloc(sizeof(item));
      curr->val = i;
      curr->next  = head;
      head = curr;
   }

   curr = head;
   item * temp;
   while(curr) {
      temp = curr->next;
      printf("%d\n", curr->val);
      free(curr);
      curr = temp;
   }
}

如果要使用数组,请使用realloc

【讨论】:

    【解决方案3】:

    这就是 C 的工作方式。您必须手动控制内存消耗、分配、释放等。

    对于您的情况,您可以:

    1. 使用重新分配。它会重新分配你的数组,增加更多的内存 它并复制它的内容。
    2. 使用一些外部库,例如 http://bstring.sourceforge.net/ 或其他东西,这将隐藏 动态字符串/数组等的复杂性
    3. 使用一些内存 管理库,它将管理您自己的池,因此内存 您的应用程序的消耗(系统可见)将是 不变,但在您的应用程序内部,您将能够灵活地管理 你的变量和数组
    4. 切换到 C++ 并使用 STL 容器。

    【讨论】:

      【解决方案4】:

      您可以使用 realloc 动态增长您之前使用 malloc 分配的“数组”(内存块)。数组的旧内容将被保留。

      http://en.cppreference.com/w/c/memory/realloc

      【讨论】:

      【解决方案5】:

      您可以尝试检查动态数组,它基本上只存储指向目标项目的指针数组。每次你想扩展数组时,你实际上只是重新分配这个指针数组并刷新指针。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-01
        相关资源
        最近更新 更多