双指针输出数组参数异常

Double pointer out array parameter exception

本文关键字:参数 异常 数组 输出 指针      更新时间:2023-10-16

我有以下函数,我打算加载着色器(错误检查删除为简洁):

unsigned int readFile(const char* file, char** buffer)
{
    FILE* fp;
    fopen_s(&fp, file, "rb");
    fseek(fp, 0, SEEK_END);
    size_t size = ftell(fp);
    fseek(fp, 0, SEEK_SET);
    *buffer = new char[size + 1];
    fread(*buffer, 1, size, fp);
    *buffer[size] = 0; // BAD LINE, only [0] is fine.
    fclose(fp);
    return 0;
}

它被调用:

char* fileContents = nullptr;
readAllFile("test.txt", &fileContents);

我想不出怎么修那条坏线。当我使用char*&buffer作为输出参数,它工作得很好,在很大程度上,引用在功能上与指针相同,对吧?

错误是:

在My World_Win32_Debug.exe中抛出0x011919D4异常:0xC0000005:访问冲突写入位置0xCCCCCCCC.

我应该如何设置缓冲区的最后一个元素为0 (null终止符)?我已经查看了调试器和缓冲区的内容是有效的,并正确设置,直到到达坏行,尽管缓冲区每次都以相同的方式引用。

只有[0]工作良好,这表明我的地址只有指针本身,而不是它的数据,但我不知道如何解决它。我所尝试的其他方法都给出了编译错误。

我知道在很多情况下引用是首选,这里还有其他问题,但我确实需要知道为什么我首先遇到上面的问题。

你想要这个:

(*buffer)[1] = 0;

代替:

*buffer[1] = 0;  // same as  *(buffer[1]) = 0;

无奈之下,我试着在每个地方加上星号和括号,然后我意识到了这个问题。buffer[size]而不是buffer。使用(*缓冲)(大小)修复问题。