我正在为一个类进行拼写检查程序,并且在尝试使用指针使其他函数可以访问哈希数组时遇到了麻烦。
以下只是代码的一小部分,因为程序太大而无法粘贴。这部分代码的基本思想是:
创建数组和指向数组的指针。 - 哈希每个单词并使用该值作为数组中的索引。 - 使用指针存储散列值。 - 使用数组和散列值的指针访问数组。
如下所述,直接访问存储在数组中的单词有效,但在尝试使用指针访问存储在数组中的单词时出现了seg错误。
==1845== Invalid read of size 8
==1845== at 0x401367: load (dictionary.c:133)
==1845== by 0x40095D: main (speller.c:45)
==1845== Address 0xfffc3fab8 is not stack'd, malloc'd or (recently) free'd
char** hash_array = calloc(HASH_TABLE_SIZE, sizeof(*hash_array));
char*** array_pointer;
// storing the address of the hash array in pointer
array_pointer = &hash_array;
uint32_t* hash_pointer;
hash_pointer = NULL;
uint32_t hash = hashlittle(word_buffer, word_length, 1578459744);
hash_pointer = &hash;
// this prints out the word successfully
printf("word in h-array: %s\n", hash_array[hash]);
// this seg faults
printf("word in h-array: %s\n", *array_pointer[*hash_pointer]);
答案 0 :(得分:0)
您看到的问题是由于取消引用运算符*
的运算符优先级。
以下都是等效的:
*array_pointer[*hash_pointer]
*array_pointer[hash]
*(array_pointer[hash])
*((&hash_array)[hash])
*(*(&hash_array + hash))
问题在于:*(&hash_array + hash)
。您尝试取消引用指向某个内存位置的指针,该指针偏离指针hash_array
的存储位置,而不是它指向的位置,这会导致未定义的行为。