【问题标题】:Am I loading my character array correctly?我是否正确加载了我的字符数组?
【发布时间】:2025-04-24 05:30:02
【问题描述】:

我已经盯着这个看了很久,它开始一起运行了。
所以我得到了一个 valgrind 错误:

==25468== Invalid write of size 4
==25468==    at 0x52CF64D: _IO_vfscanf (vfscanf.c:1857)
==25468==    by 0x52D730A: __isoc99_fscanf (isoc99_fscanf.c:35)
==25468==    by 0x402DDB: loadMindRAW (gplib.c:172)
==25468==    by 0x4047EE: loadAgent (gplib.c:739)
==25468==    by 0x4048BD: loadAgentsFromFile (gplib.c:799)
==25468==    by 0x4010C3: initRound (gpfight.c:220)
==25468==    by 0x400EBE: main (gpfight.c:99)
==25468==  Address 0x584388d is 253 bytes inside a block of size 256 alloc'd
==25468==    at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)

这是罪犯:

void loadMindRAW(FILE* f_file, unsigned char* mind)
{
    int i;
    for(i=0; i < MIND_SIZE; i++)
    {
        fscanf(f_file,"%d,",&(mind[i]));
    }
}

传入的无符号字符数组刚刚被分配: (MIND_SIZE 为 256)

tmpAgent->mind = malloc(MIND_SIZE*sizeof(unsigned char));
loadMindRAW(f_file, tmpAgent->mind);

我是否正确地指向了我的思想地址? &amp;(mind[i]) 似乎有点笨拙。原始指针操作,mind+i 具有相同的行为。我在这里遗漏了一些简单的东西吗?

【问题讨论】:

  • 这是针对 C 还是针对 C++?请适当标记。
  • 哎呀,谢谢提醒。

标签: c arrays pointers malloc valgrind


【解决方案1】:

您正确地指向了地址,但您可能无法将指向 unsigned char 的指针传递给 fscanf 在需要 int 指针的位置。这是因为fscanf看到%d说明符,它假定可变参数列表中的对应位置是一个指向有符号int的指针;由于可变参数在 C 和 C++ 中的实现方式,fscanf 没有其他方法可以解决。

下面是你应该如何重写你的循环:

for(i=0; i < MIND_SIZE; i++)
{
    int tmp;
    fscanf(f_file,"%d,",&tmp);
    mind[i] = (unsigned char)tmp;
}

【讨论】:

  • 你来了。如同一位老板。谢谢你。我盯着那个看了两个小时。 AHHHHH,这就解释了为什么它是 4 号。
  • C99 和 C11 中的另一种选择是以fscanf() 格式指定字节大小的整数:"%hhd,",这样您就可以避免使用tmp 变量。
最近更新 更多