将链表的大小从 '__int64' 截断为 'size_t



我通过创建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

相关内容

  • 没有找到相关文章