我是否应该收到此错误:可能无法初始化可变大小的对象?

时间:2014-11-23 23:30:59

标签: c arrays hash stack

我正在制作一个包含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阵列。

提前感谢任何建议,谢谢谢谢!

1 个答案:

答案 0 :(得分:1)

是。错误是预期的:无法初始化VLA(可变长度数组)。

但真正的问题似乎是你想要thisBucketCount个数量的桶,这不是这个代码的作用:

bucketP thisBucketArray[thisBucketCount]=(bucketP)malloc(sizeof(struct bucket));

您可能希望分配thisBucketCountbucket个对象。所以你需要做:

 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