当我为我的十六进制数组中的缓冲区分配空间时,我的代码一直在破坏(即抛出访问冲突异常)。
我将hex数组声明为main中的双星指针,并通过引用传递它。
在main.cpp的某处
char ** hexArray = nullptr;
fileio.cpp中的某个地方
void TranslateFile(char * byteArray, char **& hexArray, int numberOfBytes, char buffer[])
{
int temp = 0;
//Convert bytes into hexadecimal
for(int i = 0; i < numberOfBytes; i++)
{
//Convert byteArray to decimal
atoi(&byteArray[i]);
//Set temp equal to byteArray
temp = byteArray[i];
//Convert temp to hexadecimal and store it in hex array
itoa(temp, buffer, 16);
//Allocate room for buffer
hexArray[i] = new char[strlen(buffer) + 1]; //CODE BREAKS HERE
//Copy buffer into newly allocated spot
strcpy(hexArray[i], buffer);
}
}
答案 0 :(得分:3)
char ** hexArray = nullptr;
hexArray
未初始化。
hexArray[i] = new char[strlen(buffer) + 1]; //CODE BREAKS HERE
您取消引用hexArray
,但它未初始化,因此您的程序会产生未定义的行为。您需要初始化它,并且根据您的代码示例,它必须指向至少 numberOfBytes
元素。
hexArray = new char *[numberOfBytes];
现在hexArray
是一个初始化指针,指向numberOfBytes
未初始化的指针。
答案 1 :(得分:1)
您需要为外部阵列分配内存。 从你的例子来看,可能是:
hexArray = new char *[numberOfBytes];
答案 2 :(得分:1)
char **
可以是char *
的数组,也可以是指向char *
的指针。无论哪种方式,您都需要在做hexArray[i]
之前分配一些东西。
在main.cpp中的某个地方:
hexArray = new char *[NUM_CHAR_PTRS];
...后来
hexArray[i] = new char[strlen(buffer) + 1];
答案 3 :(得分:1)
您没有为hexArray
本身分配空间。你在
//Allocate room for buffer
hexArray[i] = new char[strlen(buffer) + 1]; //CODE BREAKS HERE
正在为hexArray
的元素分配内存。
所以你应该把代码放在:
hexArray = new char*[numberOfBytes];
进入for循环之前。
答案 4 :(得分:0)
numberOfBytes
中的hexArray
条目是否已分配?
使用strnlen
代替strlen
或更好std::string
。你知道buffer
是否被终止(也就是说,它是TranslateFile
合同的一部分吗?)