动态阵列打印

时间:2011-03-24 14:24:40

标签: c arrays

我正在尝试打印动态数组,但是我遇到了数组的边界问题。 举一个简单的例子,假设我试图遍历一组int。如何获得阵列的大小?我试图将数组的大小除以类似sizeof(list)/sizeof(int)的类型的大小,但这不能正常工作。我知道我试图按类型划分指针的大小。

int *list

// Populate list

int i;
for(i = 0; i < ????; i++)
  printf("%d", list[i]);

6 个答案:

答案 0 :(得分:2)

对于动态数组,您需要维护一个指向数组起始地址的指针,以及一个保存该数组中元素数量的值。可能还有其他方法,但这是我能想到的最简单的方法。

sizeof(list)也将返回4,因为编译器正在计算整数指针的大小,而不是数组的大小,并且这将始终是四个字节(取决于您的编译器)。

答案 1 :(得分:0)

没有标准化方法来获取已分配内存块的大小。您应该在list中保持unsigned listSize的大小,如下所示:

int *list;
unsigned listSize;

list = malloc(x * sizeof(int));
listSize = x;

如果您使用C ++进行编码,那么最好使用像std::vector<>这样的STL容器

答案 2 :(得分:0)

正如你所写,你确实试图划分指针的大小,因为列表被声明为指针,而不是数组。在这些情况下,您应该在构建列表期间保留列表的大小,或者使用特殊单元格(例如NULL)或其他任何不会在阵列中使用的列表来完成列表。

答案 3 :(得分:0)

应该知道数组的大小,因为你是谁分配它 sizeof是一个运算符,这意味着它在编译时完成它的工作。它将为您提供对象的大小,但不会给出数组的长度。 因此,sizeof(int *)是32/62位,具体取决于体系结构。

看看std::vector

答案 4 :(得分:0)

看到C语言问题的一些不恰当的C ++工具链接,这里是现代C的答案。

你对错误的看法是完全正确的,正如你所做的那样,你只有一个指针,没有关于分配的大小信息。

Modern C具有可变长度数组(VLA),您可以直接使用或通过malloc使用。 Direcly:

int list[n];

然后即使您同时更改了sizeof,您对n的想法也可以开箱即用。这种使用需要小心,因为这是在堆栈上分配的。你不应该在这里保留太多。与malloc一起使用:

int (list*)[n] = malloc(*list);

然后你必须调整你的代码,基本上只在(*list)的任何地方放置list

答案 5 :(得分:0)

如果按大小表示元素的数量,那么你可以将它保存在每次推送元素时获得++的计数器中,或者如果你不介意丢失的循环,你可以创建一个获取副本的函数指向第一个位置的指针,通过列表运行保持计数器,直到找到k.next == null。或者你可以保留一个列表作为下一个和上一个你不在乎的方式,如果你失去了开始。