【问题标题】:My pointer is changing address erroneously我的指针错误地更改地址
【发布时间】:2013-07-17 23:56:58
【问题描述】:

我有一个非常简单的 C 程序。我的程序使用我创建的一个非常简单的哈希文件。这是我的哈希文件:

const int SIZE = 26;

// A is 65 through Y is 89
int get_index(char key) {
   return ((int) key) - 65;
}

void reset_hash(int* hash) {
   int i = 0;
   for (; i < (SIZE - 1); i++) {
      hash[i] = 0;
   }
   hash[SIZE -1] = '\0';
}

int get_value(int* hash, char key) {
   return hash[get_index(key)];
}

void increment_value(int* hash, char key, int value) {
   hash[get_index(key)] = ++value;
}

如果绝对有必要,我可以解释一下为什么我的哈希函数如此简单。在这一点上我认为没有必要,但我可以告诉你,我的域非常简单且恒定,这就是为什么这种散列算法运行良好的原因。

现在,从另一个文件的主文件中创建一次哈希:

int* hash = calloc(SIZE_OF_AC, sizeof(int));

以下操作会以不同的顺序从同一个文件中调用:

reset_hash(hash);
get_value(hash, /* some character here */);
increment_value(hash, /* some character here */, value);

我也多次传递哈希指针,两个主要目标函数接收哈希参数如下:

int* hash

调用函数只是发送hash

现在,我正在打印hash 的地址:

printf("hash: %p\n", hash);

在我的主文件中的一个地方,但由于该函数执行了多次而被打印了多次。这是我收到的输出:

hash: 0x801010
hash: 0x801010
hash: 0x3100000000801010
Segmentation fault (core dumped)

我的问题是,为什么我的哈希地址似乎发生了变化?考虑到我上面声明的操作,在 c 中的什么条件下 int* 的起始地址会发生变化?

如果您认为我遗漏了更多重要信息,我深表歉意。让我知道,我会发布更多。感谢您的回复。

【问题讨论】:

  • 可能你在某处损坏了内存,覆盖了hash
  • 您使用的是 64 位系统,是吗? 0x801010 看起来可能是一个有效的堆地址。 0x3100000000801010 具有完全相同的低 32 位,但在高位字节中有 0x310x31 是数字 '1' 的 ASCII 码。 (请注意,不是int*地址 发生变化,而是,即它指向的地址)。
  • hash 后面和前面的数据结构是什么?
  • 为什么不直接return key - 'A'
  • 你们是对的。别的东西越过了我的哈希指针。为了证明这一点,我将散列声明为全局数组并且错误消失了。我假设这是因为数组不使用指向元素 0 的单独指针,它位于堆栈的全局部分。我仍然需要调试我的程序并找出有问题的元素是谁。感谢您提供有用的 cmets!

标签: c pointers segmentation-fault


【解决方案1】:

索引函数好像有错误没有?

// A is 65 through Y is 89
int get_index(char key) {
   return ((int) key) - 65;
}

应该是 (int) (key - 65)?

【讨论】:

  • 也一样。即使只是return key - 65; 也是一样的。
  • 如果你的意思是'A',写'A',而不是65
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-26
相关资源
最近更新 更多