我通过创建10个bucket成功地编写了一个用于基数排序的C++代码。对于这10个bucket,我是这样创建的:
struct node{
struct node* next;
long value;
};
struct node*bucket[10];
for (int i=0; i<10; ++i) {
bucket[i] = (struct node *) malloc (1000000*sizeof(struct node));
}
而且做得很完美。
但现在我需要把我的水桶数量提高到10万桶。我试着修改这些桶的大小,比如:
struct node*bucket[100000];
for (int i=0; i<100000; ++i) {
bucket[i] = (struct node *) malloc (1000000*sizeof(struct node));
}
但这一次我想我甚至不能创造那些水桶。我正在使用Visual Studio进行编码,这是用C++编写的。编译器给了我以下警告:
:警告C4305:"argument":从"__int64"截断为"size_t"
:警告C4309:"argument":截断常数值
我在网上查了一下,有人说这个数字太大了。这是我第一次在链表中处理这么大的数字。我是否需要修改任何内容才能使此代码再次工作?
谢谢。任何想法和帮助我都将不胜感激!
我把你的代码变成了一个小示例程序:
#include <stdlib.h>
struct node {
int i;
};
int main()
{
struct node*bucket[100000];
for (int i=0; i<100000; ++i) {
bucket[i] = (struct node *) malloc (1000000*sizeof(struct node));
}
}
这与Visual Studio 2010配合得很好。
我想到的是,您正在分配一个由100000个指针组成的数组(每个指针可能有4个字节)。它让我想起了旧的编译器,它不允许每个变量(或函数)使用超过64kB的堆栈空间。我不记得了。它是用Turbo Pascal或Turbo C…)
由于这是C++,我建议首先不要使用原始的C数组。相反,您可以将上述代码替换为:
#include <vector>
struct node {
int i;
};
int main()
{
std::vector<node> bucket( 100000 );
}
std::vector
对象可以用于所有使用C数组的情况。
可能问题在循环条件中:
for (int i=0; i<100000; ++i)
^^^^^^^^^
您需要有std::size_t i;
或unsigned long i;
才能比较到100000
。