Неверное чтение размера 8 в .. по - PullRequest
1 голос

он показывает недопустимое чтение размера 8 в HTSize моей основной функцией, и кажется, что он работает (он печатает 0) для пустого хэша, но я считаю, что проблема в том, что инициализированный хэш в моем HTCreate передается в качестве аргумента в HTSize, но в унифицированном виде.

Я пытался (не в показанном коде) передать аргумент как & Table с определением HTSize (HThash **), но вместо решения программа не запускается, и valgrind показывает, что «адрес 0x0 не является стеком 'd, malloc'd или (недавно) free'd ". Внутри функции я также поместил указатель T на хеш для разыменования ** хеша. Я работаю в linux.

typedef char* KeyType;
typedef int HTItem;
typedef struct node{
    KeyType key;
    HTItem item;
    struct node *next;
}List;
typedef struct {
    List *head;
}TableEntry;
typedef TableEntry *HTHash;

HTHash* HTCreate(void);
int HTSize(HTHash);

int TABLESIZE = 10;

int main(void)
{
    HTItem *p;
    HTHash *Table = HTCreate();
    printf("%d\n",HTSize(*Table));
}

HTHash* HTCreate(void)
{
    int i;
    HTHash table = (HTHash)malloc(TABLESIZE*sizeof(TableEntry));
    HTHash *T;
    for(i=0;i<TABLESIZE;i++)
        table[i].head = NULL;
    T = &table;
    return T;
}

int HTSize(HTHash hash)
{
    int i,count=0;
    List *temp = (List*)malloc(sizeof(List));   
    for(i=0;i<TABLESIZE;i++)
    {
        if(hash[i].head != NULL)
        {
            count++;
            temp = hash[i].head->next;
            while(temp != NULL)
            {
                count++;
                temp = temp->next;
            }
        }   
    }
    return count;   
}

Ошибка может быть в HTCreate, но я не уверен. Я проверил, инициализируется ли хэш в основной функции, и он делает.

1 Ответ

1 голос
/ 29 мая 2019

Ваша проблема в функции HTCreate: она возвращает &table, который является локальным для функции.

Демо-версия:

HTHash *HTCreate(void)
{
    int i;

    HTHash table = NULL;

    printf("&table before malloc: %p\n", &table);

    table = malloc(TABLESIZE*sizeof(TableEntry));

    printf("&table after  malloc: %p\n", &table);

    HTHash *T;

    for(i=0;i<TABLESIZE;i++)
        table[i].head = NULL;

    T = &table;
    return T;
}

Напечатает:

&table before malloc: 0x7fff200eb818
&table after  malloc: 0x7fff200eb818

Мы видим, что malloc не влияет на это значение.

Поскольку это локально для функции, использование этой функции в другой функции может вызвать что угодно (неопределенное поведение)

Хороший способ вернуть то, что вам нужно из функции, - это вернуть HTHash тип:

HTHash HTCreate(void)
{
    int i;

    HTHash table = malloc(TABLESIZE*sizeof(TableEntry));

    for(i=0;i<TABLESIZE;i++)
        table[i].head = NULL;

    return table;
}

Посмотрев, что в нем сделано, я увидел, что эту функцию можно упростить:

HTHash HTCreate(void)
{
    return calloc(TABLESIZE, sizeof(TableEntry));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...