【问题标题】:Access violation writing location inserting to array访问冲突写入位置插入到数组
【发布时间】:2011-10-25 23:28:29
【问题描述】:

我从调试器收到访问冲突错误,但我真的不知道为什么。我怀疑这将是一件非常愚蠢的事情。 我有一个目录条目数组:

typedef struct dirEntry{
    TCHAR fileName[MAX_PATH];
    DWORD fileSizeLow;
    DWORD fileSizeHigh;
} dirEntry;

DWORD bufferSize = MEM_SIZE; //MEM_SIZE = 100
DWORD bufferPosition = 0;
dirEntry* dirBuffer;

dirBuffer = (dirEntry*) malloc(bufferSize*sizeof(dirEntry));

然后我将它传递给一个函数ListDirectory(_T("D:\\books\\*"), dirBuffer, &bufferSize, &bufferPosition)

在函数内部,我检索有关内部文件的信息,但是当我调用它时:

dirBuffer[*bufferPosition].fileSizeLow = dataFound.nFileSizeLow;
_tcscpy(dirBuffer[*bufferPosition].fileName, dataFound.cFileName);
*bufferPosition++;

第一行产生异常。有人可以告诉我我做错了什么吗?

编辑:ListDirectory 的代码按要求:http://pastebin.com/ScbcqX7p

【问题讨论】:

  • bufferPosition 是一个有效数字吗? IE。它比bufferSize小吗?另外,dataFound 是否已初始化?
  • 是的,很抱歉没有在问题中提及,我已将其添加到 sn-p。
  • 是的,它们是有效数字。至于 dataFound - 它确实有效,因为我可以将内容打印到控制台。
  • 也许ListDirectory 的代码会有所帮助
  • 如果发生错误,您释放在调用函数外部分配的缓冲区。不要那样做。此外,如果发生这种情况并且你再次调用ListDirectory(为什么你有realloc?)它会在崩溃的地方崩溃。

标签: c winapi


【解决方案1】:

*bufferPosition++ 并没有按照你的想法去做。它取消引用bufferPosition,然后递增指针,而不是指向的值。你可能想要(*bufferPosition)++,它会增加指向的值。

请注意,不清楚为什么要通过地址传递 bufferPositionbufferSize,因为它们对调用者无用,因为 ListDirectory 释放了变量引用的数据。

【讨论】:

  • 感谢您指出这一点。与按地址传递一样 - 我已经删除了对函数中错误处理的调用。我需要这样,因为我需要在函数之外使用数组。
  • 那么你还需要将更新后的数组传回给调用者。
  • 你能再帮忙做一件事吗? dirBuffer 的分配保持不变,我只是在传递它时添加了 & 运算符并修改了代码。这是错误的:(*dirBuffer)[*bufferPosition].fileSizeLow = dataFound.nFileSizeLow;?因为它仍在做同样的事情。
猜你喜欢
  • 1970-01-01
  • 2015-08-15
  • 2020-09-04
  • 2012-12-05
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多