动态内存分配,提供访问冲突

时间:2013-03-07 03:08:45

标签: c++ pointers dynamic-memory-allocation

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

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

5 个答案:

答案 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合同的一部分吗?)