1

考虑一下 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))

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

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

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

4

5 回答 5

7

您需要一个动态数据集,例如动态分配的数组。您可以使用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

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

于 2012-07-15T14:54:54.040 回答
3

您可以使用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

于 2012-07-15T14:55:37.110 回答
2

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

对于您的情况,您可以:

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

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

请参阅http://en.cppreference.com/w/c/memory/realloc

于 2012-07-15T14:49:29.067 回答
0

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

于 2012-07-15T14:58:01.197 回答