循环分配内存时的分段错误

时间:2015-09-28 17:22:41

标签: c segmentation-fault malloc

我在C中创建一个哈希表,其键的类型为char *。我将密钥存储在表中本身的原因超出了此问题的范围。哈希表大部分都在工作,除了以下问题:当表大小超过2112个元素并且我尝试将键初始化为NULL指针时,我遇到了分段错误。

这是hashTable的定义:

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指针初始化表作为键:

// 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中的动态内存分配相对较新,并且已经在这个问题上停留了一段时间。如果有人有任何见解或建议,我将非常感激。

1 个答案:

答案 0 :(得分:6)

设置cp时,您无需将i乘以sizeof。指针算术自动乘以指针指向的对象的大小。结果是你乘以两次,所以你写的远远超出数组边界。所以它应该是

char **cp = symbolTable->keys + i;

但您可以简单地使用普通的数组索引:

symbolTable->keys[i] = NULL;