簡體   English   中英

將鏈結列表的大小從'__int64'截斷為'size_t

[英]Truncation the size of linked list from '__int64' to '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:'參數':截斷常數

我在互聯網上進行搜索,有人說這個數字太大。 這是我第一次在鏈接列表中處理這么大的數字。 我是否需要修改任何內容以使此代碼再次起作用?

謝謝。 任何想法和幫助,我將不勝感激!

我將您的代碼變成了一個小示例程序:

#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個字節)。 它讓我想起了舊的編譯器,該編譯器不允許每個變量(或函數?我不記得了。它使用Turbo Pascal或Turbo C ...)占用的堆棧空間超過64kB。

由於這是C ++,因此我建議首先不要使用原始的C數組。 相反,您可以將以上代碼替換為:

#include <vector>

struct node {
    int i;
};

int main()
{
    std::vector<node> bucket( 100000 );
}

在使用C數組的所有情況下都可以使用std::vector對象。

問題可能出在循環條件中:

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

您需要具有std::size_t i; 或未unsigned long i; 比較到100000

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM