2011-03-24 59 views
0

我想打印一个动态数组,但我遇到了数组的界限问题。 对于一个简单的例子,我们可以说我试图循环访问一个int数组。我怎样才能得到数组的大小?我试图按照这种sizeof(list)/sizeof(int)这种类型的大小来分割数组的大小,但那是不正确的。我知道我试图按类型划分指针的大小。动态阵列打印

int *list 

// Populate list 

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

回答

0

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

2

使用动态阵列需要一个指针保持到所述阵列的起始地址和保持该数组中元素的数目的值。可能还有其他方法,但这是我能想到的最简单的方法。

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

0

没有标准化的方法来获取分配的内存块的大小。您应该保留的list大小unsigned listSize这样的:

int *list; 
unsigned listSize; 

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

如果在C++编码,那么最好是使用STL容器喜欢std::vector<>

0

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

0

看到一些inapropriate链接到C++工具的一个C问题的,这里是现代C.

你的什么地方出了错想法是完全正确的答案,因为你做到了,你只能有一个指针,没有关于分配的大小信息。

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

int list[n]; 

,然后你的想法与sizeof作品开箱,即使你在平均时间改变了你的n。这个用法需要谨慎,因为这是在栈上分配的。你不应该在这里保留太多。对于使用malloc一个用途:

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

然后你不得不去适应你的代码位基本上把一个(*list)无处不在,你方才list

0

如果大小你的意思是元素的数量,那么你可以把它放在一个++你推一个元素,或者如果你不介意失去的周期,你可以作出这样得到的副本的功能,每次得到一个计数器指向第一个位置的指针通过列表运行,直到找到k.next == null为止。或者你可以保留一个列表,如果你失去了开始,那么你就不会在乎这种方式。