双指针出数组参数异常
Double pointer out array parameter exception
我有以下函数,我打算用它来加载着色器(为简洁起见删除了错误检查):
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 参数时,它工作正常,并且引用在很大程度上与指针在功能上相同,对吗?
错误是:
Exception thrown at 0x011919D4 in My World_Win32_Debug.exe:
0xC0000005: Access violation writing location 0xCCCCCCCC.
我应该如何将缓冲区的最后一个元素设置为 0(空终止符)?我查看了调试器,缓冲区的内容是有效的,并且设置正确直到到达错误行,尽管每次都以相同的方式引用缓冲区。
只有 [0] 工作正常,对我来说这表明我只处理指针本身,而不是数据,但我不知道如何处理它。我尝试过的所有其他方法都会出现编译错误。
我知道在很多情况下引用是首选,这里还有其他问题,但我确实需要先知道为什么我会遇到上述问题。
无奈之下,我试着把星号和括号放在各处,然后我意识到了问题所在。操作顺序试图遵循 buffer[size] 而不是 buffer。使用 (*buffer)[size] 解决了这个问题。
你想要这个:
(*buffer)[1] = 0;
而不是:
*buffer[1] = 0; // same as *(buffer[1]) = 0;
我有以下函数,我打算用它来加载着色器(为简洁起见删除了错误检查):
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 参数时,它工作正常,并且引用在很大程度上与指针在功能上相同,对吗?
错误是:
Exception thrown at 0x011919D4 in My World_Win32_Debug.exe: 0xC0000005: Access violation writing location 0xCCCCCCCC.
我应该如何将缓冲区的最后一个元素设置为 0(空终止符)?我查看了调试器,缓冲区的内容是有效的,并且设置正确直到到达错误行,尽管每次都以相同的方式引用缓冲区。
只有 [0] 工作正常,对我来说这表明我只处理指针本身,而不是数据,但我不知道如何处理它。我尝试过的所有其他方法都会出现编译错误。
我知道在很多情况下引用是首选,这里还有其他问题,但我确实需要先知道为什么我会遇到上述问题。
无奈之下,我试着把星号和括号放在各处,然后我意识到了问题所在。操作顺序试图遵循 buffer[size] 而不是 buffer。使用 (*buffer)[size] 解决了这个问题。
你想要这个:
(*buffer)[1] = 0;
而不是:
*buffer[1] = 0; // same as *(buffer[1]) = 0;