我正在制作一个包含9,997个数组的哈希表。我目前正在尝试初始化整个哈希表数组,其中collisionCount为0,并且桶内的指针将链表创建为NULL。提供的“data.txt”文件在文本文件的第一行提供了存储桶计数,因此这是我从中获取存储区的数量。
无论如何,这里有一些代码:
哈希.h:
#ifndef _Hashing_h
#define _Hashing_h
#include <stdio.h>
typedef struct bucket *bucketP;
typedef struct key *keyP;
/*
* Creates the initial empty bucket array
* from parameters
*/
bucketP createBucketArray(FILE *);
#endif
Hashing.c:
#include <stdio.h>
#include <stdlib.h>
#include "Hashing.h"
struct bucket
{
int collisionCount;
keyP *firstKey;
};
struct key
{
int thisKey;
keyP *nextKey;
};
int main()
{
FILE *fptr;
int bucketCount, keyCount;
fptr = fopen("data.txt", "r");
fscanf(fptr, "%d %d", &bucketCount, &keyCount);
bucketP thisArray = createBucketArray(fptr);
fclose(fptr);
return 0;
}
bucketP createBucketArray(FILE *fp)
{
int thisBucketCount;
int i = 0;
fscanf(fp, "%d", &thisBucketCount);
bucketP thisBucketArray[thisBucketCount] = (bucketP) malloc(sizeof(struct bucket));
for (i = 0 ; i < thisBucketCount ; i++)
{
thisBucketArray[i]->collisionCount = 0;
thisBucketArray[i]->firstKey = 0x00;
}
return thisBucketArray;
}
错误内容如下:
error : variable-sized object may not be initialized
...thisBucketArray[thisBucketCount] = (bucketP) malloc(sizeof(struct bucket));
^
由于这是我第一次收到错误消息,所以我研究了它,发现当你尝试为堆栈声明一些太大的东西时,通常会抛出上面的错误消息。但是,'thisBucketCount'的值仅为9,997。这创建了一个包含9,997个非常简单结构的数组(struct bucket
中只有两个参数,一个是int,另一个是指针。
我真的在为我的堆栈创建一个太大的数组吗?我觉得我必须为此制作一个WAY BIGGER阵列。
提前感谢任何建议,谢谢谢谢!
答案 0 :(得分:1)
是。错误是预期的:无法初始化VLA(可变长度数组)。
但真正的问题似乎是你想要thisBucketCount
个数量的桶,这不是这个代码的作用:
bucketP thisBucketArray[thisBucketCount]=(bucketP)malloc(sizeof(struct bucket));
您可能希望分配thisBucketCount
个bucket
个对象。所以你需要做:
bucketP thisBucketArray = malloc(thisBucketCount * sizeof(struct bucket));
if (thisBucketArray == 0)
{
/*handle error */
}
for (i = 0 ; i < thisBucketCount ; i++)
{
thisBucketArray[i].collisionCount = 0;
thisBucketArray[i].firstKey = 0x00;
}
请注意我已删除了演员。 casting the result of malloc()
is error-prone and dangerous.
您还应检查malloc()
是否失败,检查它是否返回NULL
。