C Valgrind指向结构的指针数组出现无效写入错误

C Valgrind指向结构的指针数组出现无效写入错误,c,valgrind,C,Valgrind,我从valgrind那里得到了一个错误(实际上是一大堆错误),我在整理这个错误时遇到了麻烦 我正在使用以下代码声明一个结构: struct HashTableT { HashFuncT hashFunc; // array of SortedList's SortedListPtr* arrayPtr; }; typedef struct HashTableT* HashTable; arrayPtr是指向指向其他结构的指针数组的指针。 然后使用以下命令为其分配内存: HashTable

我从valgrind那里得到了一个错误(实际上是一大堆错误),我在整理这个错误时遇到了麻烦

我正在使用以下代码声明一个结构:

struct HashTableT {

HashFuncT hashFunc;
// array of SortedList's
SortedListPtr* arrayPtr;
};

typedef struct HashTableT* HashTable;
arrayPtr是指向指向其他结构的指针数组的指针。 然后使用以下命令为其分配内存:

HashTable index;
index = malloc(sizeof(HashTable));
memcheck(index);
index->hashFunc = func;
index->arrayPtr = malloc(sizeof(SortedListPtr) * size);
memcheck(index->arrayPtr);
// initialize array
int i;
for (i = 0; i < size; i++) {
    index->arrayPtr[i] = NULL;
}
return index;
第35行包含malloc语句。在我看来,我是在分配,而不是写,所以这个错误让我困惑,我不知道该怎么办。感谢您的帮助

谢谢

index = malloc(sizeof(HashTable));
Malloc有足够的内存用于指针,而不是结构

这也说明了为什么像这样隐藏类型的typedef会让事情变得混乱

Malloc有足够的内存用于指针,而不是结构


这也说明了为什么像这样隐藏类型的typedef会让事情变得混乱。

我还没有尝试为其他结构分配内存。我在这部分代码中的意图是为哈希表结构和指针数组分配内存。正确,正如我在上面指出的,您没有这样做。您正在malloc'ing
index=malloc(sizeof(HashTableT*))
(如果去掉typedef),它是指针的大小,而不是结构的大小。然后尝试使用
index->arrayPtr
,它将在malloc的内存之外。在这一点上,坏事发生了。啊,现在我明白了。将其更改为
sizeof(struct hashtable)
解决了错误。感谢您的帮助。若要添加:您可以将其更改为:
index=malloc(sizeof(*index))
,您将获得正确的内存量(或者,
sizeof(struct hashtable)
),没有问题。一般来说,像这样使用typedef似乎很方便,但这会让事情变得不那么明显。我还没有尝试为其他结构分配内存。我在这部分代码中的意图是为哈希表结构和指针数组分配内存。正确,正如我在上面指出的,您没有这样做。您正在malloc'ing
index=malloc(sizeof(HashTableT*))
(如果去掉typedef),它是指针的大小,而不是结构的大小。然后尝试使用
index->arrayPtr
,它将在malloc的内存之外。在这一点上,坏事发生了。啊,现在我明白了。将其更改为
sizeof(struct hashtable)
解决了错误。感谢您的帮助。若要添加:您可以将其更改为:
index=malloc(sizeof(*index))
,您将获得正确的内存量(或者,
sizeof(struct hashtable)
),没有问题。一般来说,像这样使用typedef似乎很方便,但它会让事情变得不那么明显。
index = malloc(sizeof(HashTable));