C - 写入访问冲突

时间:2017-06-12 16:32:37

标签: c malloc unhandled-exception

我在最后一行有一个错误,在nullString中,一个函数将所有字符串设置为' \ 0'用简单的for()

void function ( unsigned char inputArray[], size_t inputSize )
{
    size_t cellSize;
    if (inputSize <= 256)
        cellSize = 1;
    else
        cellSize = ceil(inputSize / 2 / 256) + 1;


    // Sub Box
    unsigned char subBox[255];
    for (size_t line = 0; line < 255; line++)
        subBox[line] = 0;

    generate_SubBox(subBox, key);
    // Sub Box


    // Sub Box reverse
    unsigned char subBox_Inverse[255];
    for (size_t line = 0; line < 255; line++)
        subBox_Inverse[line] = 0;

    generate_SubBox_Inverse(subBox_Inverse, subBox, key);
    // Sub Box reverse        

    unsigned char* inputArray2 = NULL;
    inputArray2 = malloc(sizeof(unsigned char)* inputSize / 2);
    verifyMalloc(inputArray2);
    nullString(inputArray2, inputSize / 2);

    unsigned char string_temp[3] = { 0 };
    size_t w = 0;
    for (size_t i = 0; i < inputSize / 2; i++)
    {
        string_temp[0] = inputArray[w];
        string_temp[1] = inputArray[w + 1];

        inputArray2[i] = strtoll(string_temp, NULL, 16);

        w += 2;
    }
}

我尝试通过对它们进行评论来中和每行的所有指令,但是它并没有改变任何东西。

如果我中和了nullString,则错误发生在

之后

inputArray2[i] = strtoll(...)

希望你能得到答案:)

提前致谢!

编辑: 这是nullString:

void nullString(unsigned char input[], size_t length)
{
    for (size_t x = 0; x < length; x++)
        input[x] = '\0';
}

我在nullString之前评论了所有指令,错误仍然存​​在。

我还验证了变量,它们看起来都很好

编辑2: verifyMalloc:

void verifyMalloc(int* pointer)
{
    if (pointer == NULL)
    {
        perror("Erreur");

        Sleep(15000);
        exit(0);
    }
}

2 个答案:

答案 0 :(得分:0)

尝试使用

void bzero(void *s, size_t n); or
void *memset(void *s, int c, size_t n);

而不是你的nullString()和for()某些东西[x] = 0循环。

然后,这不会使所有数组归零:

unsigned char string_temp[3] = { 0 };

这使得

string[0] = 0;
string[1] = god_knows;
string[2] = god_knows_not;

so either - unsigned char string_temp[3] = {0,0,0}; 
or bzero(string_temp,3);

因此,当你这样做时:

string_temp[0] = inputArray[w];
string_temp[1] = inputArray[w + 1];

inputArray2[i] = strtoll(string_temp, NULL, 16);

strtoll()将猜测何时停止。不能保证这是在string_temp [2]。

然后,这应该足够了:

unsigned char* inputArray2 = malloc(sizeof(unsigned char) * inputSize / 2);

如果malloc失败,inputArray2将为NULL,如果成功则为有效指针。

您可能想要检查您的inputSize / this_and_that算术。它真的能满足你的期望吗?您可能会对整数操作数的除法结果感到惊讶。

这看起来也很可疑:

inputArray2[i] = strtoll(string_temp, NULL, 16);

strtoll返回longlong整数,但inputArray2是unsigned char类型。所以你试图存储8个字节(sizeof longlong = 8),你只保留一个地方(sizeof char = 1)

将您的inputArray2重新声明为

long long *inputArray2 = malloc(sizeof(long long) * inputSize /2 );

尝试使用memset():

size_t size = sizeof(long long) * inputSize/2; 
//Do you really need long long? You are storing max three digits. uint_8 will be enough

long long* inputArray2 = malloc(size);
memset(inputArray2, 0, size);

答案 1 :(得分:0)

我们所看到的一切都在严肃地暗示你忘记了#include <stdlib.h>(而忽略了由此产生的警告)。

当您使用malloc()而不在同一文件中包含stdlib.h时,可能会发生这种情况:

  • 编译器认为malloc()函数是隐式声明的,这意味着它假设它的返回类型是int(而不是*void)。
  • sizeof (int)sizeof (*void)相同时,此可能有效。但是当int为32位而指针为64位时,malloc()返回的地址可能会丢失一半的位并指向无效的地址。