2

我通过创建 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: 'argument' : 从 '__int64' 截断到 'size_t'

: 警告 C4309: 'argument' : 截断常数值

我在网上搜了一下,有人说这个数字太大了。这是我第一次在链表中处理这么大的数字。我是否需要修改任何内容以使此代码再次工作?

谢谢你。任何想法和帮助我将不胜感激!

4

2 回答 2

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 数组的所有情况下使用。

于 2012-03-13T07:32:32.387 回答
0

问题可能出在循环条件中:

for (int i=0; i<100000; ++i)
              ^^^^^^^^^

您需要拥有std::size_t i;unsigned long i;比较 until 100000

于 2012-03-13T07:26:17.223 回答