将链表大小从“__int64”截断为“size_t”

时间:2012-03-13 07:21:14

标签: c++ linked-list size-t

我通过创建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:'参数':截断常数值

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

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

2 个答案:

答案 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