遍历分配的内存时出现分段错误
Segmentation Fault when Looping over Allocated Memory
我正在用 C 语言创建散列 table,其键的类型为 char*。由于超出此问题范围的原因,我将密钥存储在 table 本身中。散列 table 大部分工作正常,但以下问题除外:当 table 大小超过 2112 个元素并且我尝试将键初始化为 NULL 指针时,我 运行 进入分段错误。
哈希表的定义如下:
typedef struct hash_table
{
uint32_t size; // # of elements the table can store
uint32_t count; // # of elements in the table
char **keys; // The pointer to the first key. Each key is a char*
int32_t *vals; // The pointer to the first val.
} hashTable;
这里是我用 NULL 指针作为键初始化 table 的地方:
// Declare the pointer to the hash table
hashTable *symbolTable = malloc(sizeof(hashTable));
// Set the hash table properties
symbolTable->size = 7699;
symbolTable->count = 0;
symbolTable->keys = malloc(sizeof(symbolTable->keys[0]) * symbolTable->size);
symbolTable->vals = malloc(sizeof(symbolTable->vals[0]) * symbolTable->size);
// Initialize the keys to be NULL pointers.
int i;
for (i = 0; i < symbolTable->size; i++)
{
char **cp = symbolTable->keys + i * sizeof(symbolTable->keys[0]);
*cp = NULL;
}
当我 运行 程序时,当 i==2111 时,我在 for 循环中遇到分段错误。
我对 C 中的动态内存分配比较陌生,并且在这个问题上卡住了一段时间。如果有人有任何见解或建议,我将不胜感激。
设置cp
时,不需要i
乘以sizeof
。指针算法自动乘以指针指向的对象的大小。结果是你乘了两次,所以你写的远远超出了数组边界。所以应该是
char **cp = symbolTable->keys + i;
但您可以简单地使用普通数组索引代替:
symbolTable->keys[i] = NULL;
我正在用 C 语言创建散列 table,其键的类型为 char*。由于超出此问题范围的原因,我将密钥存储在 table 本身中。散列 table 大部分工作正常,但以下问题除外:当 table 大小超过 2112 个元素并且我尝试将键初始化为 NULL 指针时,我 运行 进入分段错误。
哈希表的定义如下:
typedef struct hash_table
{
uint32_t size; // # of elements the table can store
uint32_t count; // # of elements in the table
char **keys; // The pointer to the first key. Each key is a char*
int32_t *vals; // The pointer to the first val.
} hashTable;
这里是我用 NULL 指针作为键初始化 table 的地方:
// Declare the pointer to the hash table
hashTable *symbolTable = malloc(sizeof(hashTable));
// Set the hash table properties
symbolTable->size = 7699;
symbolTable->count = 0;
symbolTable->keys = malloc(sizeof(symbolTable->keys[0]) * symbolTable->size);
symbolTable->vals = malloc(sizeof(symbolTable->vals[0]) * symbolTable->size);
// Initialize the keys to be NULL pointers.
int i;
for (i = 0; i < symbolTable->size; i++)
{
char **cp = symbolTable->keys + i * sizeof(symbolTable->keys[0]);
*cp = NULL;
}
当我 运行 程序时,当 i==2111 时,我在 for 循环中遇到分段错误。
我对 C 中的动态内存分配比较陌生,并且在这个问题上卡住了一段时间。如果有人有任何见解或建议,我将不胜感激。
设置cp
时,不需要i
乘以sizeof
。指针算法自动乘以指针指向的对象的大小。结果是你乘了两次,所以你写的远远超出了数组边界。所以应该是
char **cp = symbolTable->keys + i;
但您可以简单地使用普通数组索引代替:
symbolTable->keys[i] = NULL;