正确解除引用字符串数组

时间:2016-08-31 01:11:19

标签: c arrays pointers hash

我正在为一个类进行拼写检查程序,并且在尝试使用指针使其他函数可以访问哈希数组时遇到了麻烦。

以下只是代码的一小部分,因为程序太大而无法粘贴。这部分代码的基本思想是:

创建数组和指向数组的指针。 - 哈希每个单词并使用该值作为数组中的索引。 - 使用指针存储散列值。 - 使用数组和散列值的指针访问数组。

如下所述,直接访问存储在数组中的单词有效,但在尝试使用指针访问存储在数组中的单词时出现了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]);

1 个答案:

答案 0 :(得分:0)

您看到的问题是由于取消引用运算符*的运算符优先级。

以下都是等效的:

*array_pointer[*hash_pointer]

*array_pointer[hash]

*(array_pointer[hash])

*((&hash_array)[hash])

*(*(&hash_array + hash))

问题在于:*(&hash_array + hash)。您尝试取消引用指向某个内存位置的指针,该指针偏离指针hash_array的存储位置,而不是它指向的位置,这会导致未定义的行为。