c - 为什么内存损坏会存在……只有当我们不打印被损坏的变量时?

标签 c memory-corruption

<分区>

我在 C 中遇到一个奇怪的错误。我们有以下代码,我首先在没有中间两个 fprintf(f, "Passed PKLEN pklen: %u ,params->pklen: %u\n", pklen, params->pklen); 运行并且出现内存损坏,其中 pklen 停止等于 params->pklen。当我添加这两个中间的 println 以确定实际损坏发生的位置时......这两个与最后一个相等。

void ntru_get_seed(uint8_t *msg, uint16_t msg_len, NtruIntPoly *h, uint8_t *b, const NtruEncParams *params, uint8_t *seed) {
  FILE *f = fopen("log.txt", "a");
  uint16_t oid_len = sizeof params->oid;
  uint16_t pklen = params->pklen;
  fprintf(f, "Passed PKLEN pklen: %u ,params->pklen: %u \n", pklen, params->pklen);
  fflush(f);
​
  uint8_t bh[ntru_enc_len(params)];
  fprintf(f, "Passed PKLEN pklen: %u ,params->pklen: %u \n", pklen, params->pklen);

  ntru_to_arr(h, params->q, (uint8_t*)&bh);
  fprintf(f, "Passed PKLEN pklen: %u ,params->pklen: %u \n", pklen, params->pklen);

​
  uint8_t htrunc[pklen/8];
  fprintf(f, "Passed PKLEN pklen: %u ,params->pklen: %u \n", pklen, params->pklen);
  fprintf(f, "bh: %u \n", &bh);
  fflush(f);
...

最佳答案

当然。添加对 fprintf() 的调用会将代码的其他部分移到内存中并更改被覆盖的内容。

放回旧的损坏代码并使用调试器单步执行它,您可以看到被覆盖的内容。

同时打开所有可能的警告和错误并修复您的代码,这样您就不会收到任何警告和错误。

关于c - 为什么内存损坏会存在……只有当我们不打印被损坏的变量时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38336350/

相关文章:

c - 在C中生成随机数并将其写入文本文件

使用递归计算c中单词(字符串)中字母出现的次数

c - 从链表中释放节点(内存方面)

c - 运行 malloc 后内存损坏

c++ - VS2008 调试器显示不正确的值。如何清理/重置/修复调试器?

java - java swing 中的字体损坏(缓存?)

对使用 gcc 收到的编译器错误感到困惑

c - 使用循环查找除数

c - 我想打印输入字符串中以空格分隔的单词

C 腐败或双重释放,为什么?