我正在尝试打印动态数组,但是我遇到了数组的边界问题。
举一个简单的例子,假设我试图遍历一组int。如何获得阵列的大小?我试图将数组的大小除以类似sizeof(list)/sizeof(int)
的类型的大小,但这不能正常工作。我知道我试图按类型划分指针的大小。
int *list
// Populate list
int i;
for(i = 0; i < ????; i++)
printf("%d", list[i]);
答案 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。或者你可以保留一个列表作为下一个和上一个你不在乎的方式,如果你失去了开始。