双指针输出数组参数异常

时间:2015-09-02 05:48:25

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

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

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 *&缓冲区作为out参数它工作正常,并且大部分引用在功能上与指针右相同?

错误是:

  

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

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

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

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

2 个答案:

答案 0 :(得分:1)

你想要这个:

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

而不是:

                        cpassword :"Password not matched"
                }
        submitHandler: function() {

答案 1 :(得分:0)

出于绝望,我尝试到处放置星星和支架,我意识到了问题。操作顺序正在尝试依赖缓冲区[大小] 而不是缓冲区。使用(* buffer)[size] 修复了问题。