【问题标题】:Double pointer out array parameter exception双指针出数组参数异常
【发布时间】:2015-09-02 14:11:25
【问题描述】:

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

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 作为 out 参数时,它可以正常工作,并且大部分引用在功能上与指针相同,对吗?

错误是:

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

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

只有 [0] 工作正常,这表明我只处理指针本身,而不是数据,但我不知道如何处理它。我尝试过的所有其他方式都会产生编译错误。

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

【问题讨论】:

    标签: c++ file-io visual-studio-2015 access-violation


    【解决方案1】:

    你想要这个:

    (*buffer)[1] = 0;
    

    代替:

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

    【讨论】:

      【解决方案2】:

      出于绝望,我尝试将星号和括号放在任何地方,我意识到了问题所在。操作顺序试图遵循 buffer[size] 而不是 buffer。使用 (*buffer)[size] 可以解决问题。

      【讨论】:

        猜你喜欢
        • 2011-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-01
        • 2017-01-30
        • 1970-01-01
        相关资源
        最近更新 更多