1

当我为十六进制数组中的缓冲区分配空间时,我的代码不断中断(即抛出访问冲突异常)。

我在 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);
}
}
4

5 回答 5

3
char ** hexArray = nullptr;

hexArray未初始化。

hexArray[i] = new char[strlen(buffer) + 1]; //CODE BREAKS HERE

您取消引用hexArray,但它未初始化,因此您的程序会产生未定义的行为。您需要对其进行初始化,并且根据您的代码示例,它必须至少 指向numberOfBytes元素。

hexArray = new char *[numberOfBytes];

NowhexArray是一个已初始化的指针,它指向numberOfBytes未初始化的指针。

于 2013-03-07T03:12:08.410 回答
1

您需要为外部数组分配内存。从您的示例中,可能是:

hexArray = new char *[numberOfBytes];
于 2013-03-07T03:12:42.437 回答
1

char **要么是一个数组,char *要么是一个指向 a 的指针char *。无论哪种方式,您都需要先分配一些东西,然后才能执行hexArray[i].

main.cpp 中的某处:

hexArray = new char *[NUM_CHAR_PTRS];

之后...

hexArray[i] = new char[strlen(buffer) + 1];
于 2013-03-07T03:13:23.097 回答
1

您不为hexArray自身分配空间。你做了什么

 //Allocate room for buffer
 hexArray[i] = new char[strlen(buffer) + 1]; //CODE BREAKS HERE

正在为 的元素分配内存hexArray

所以你应该把代码:

hexArray = new char*[numberOfBytes];

在进入for循环之前。

于 2013-03-07T03:14:56.443 回答
0

是否已经分配了numberOfBytes条目?hexArray

使用strnlen代替strlen或更好std::string。你知道是否buffer终止(即它是TranslateFile合同的一部分)吗?

于 2013-03-07T03:15:03.793 回答