[英]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.