我通过创建10个桶成功地为基数排序编写了一个C ++代码。对于10个桶,我以这种方式创建它们:
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));
}
这是完美的。
但是现在我需要将我的桶数量提高到100000.我试图修改这些桶的大小如下:
struct node*bucket[100000];
for (int i=0; i<100000; ++i) {
bucket[i] = (struct node *) malloc (1000000*sizeof(struct node));
}
但是这次我觉得我甚至无法创造那些水桶。我使用Visual Studio进行编码,这是在C ++中。编译器给了我这些警告:
:警告C4305:'参数':从'__int64'截断到'size_t'
:警告C4309:'参数':截断常数值
我在网上查了一下,有人说数字太大了。这是我第一次在链表中处理这么大的数字。我是否需要修改任何内容才能使此代码再次运行?
谢谢。任何想法和帮助我将不胜感激!
答案 0 :(得分:4)
我将您的代码转换为一个小示例程序:
#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数组的所有情况。
答案 1 :(得分:0)
可能问题出现在循环条件中:
for (int i=0; i<100000; ++i)
^^^^^^^^^
您需要std::size_t i;
或unsigned long i;
进行比较,直至100000
。