c - 遍历分配的内存时出现段错误

标签 c segmentation-fault malloc

我正在用 C 语言创建一个哈希表,其键的类型为 char*。由于超出此问题范围的原因,我将 key 存储在表本身中。散列表大部分工作正常,但以下问题除外:当表大小超过 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 指针作为键初始化表的地方:

// 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 - 遍历分配的内存时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32828533/

相关文章:

c - C 的自动 FSM

c - 功能结束时出现段错误

c++ - Pthreaded 程序在 Linux 机器上导致段错误。在 Cygwin64 上运行良好

c - 对 `startswith' 的 undefined reference

代码优化

c - C 中神秘的段错误

c - Malloc 没有分配我告诉它的那么多内存(我相信)

c - if 语句中的 malloc(),仅当输入 (if) 时才分配,但 valgrind 表示字节丢失

c - 不兼容的指针类型将 'char [3]' 传递给类型 'FILE *' 的参数

c++ - EnumMonitors WinAPI 上的段错误