C - 写入访问冲突

C - Write access violation

提问人:Tom Clabault 提问时间:6/13/2017 最后编辑:Tom Clabault 更新时间:11/15/2023 访问量:1994

问:

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

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() 之前的所有指令,但它没有改变任何东西。

如果我中和 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: 验证Malloc:

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

        Sleep(15000);
        exit(0);
    }
}
c malloc 未处理异常

评论

1赞 harper 6/13/2017
可能您的问题出在其他地方。你介意显示这个功能吗?nullString()
0赞 harper 6/13/2017
隔离故障的想法:1)通过注释掉来停用所有不相关的代码。如果故障消失,请查找最后一个更改。2) 使用调试器,并在发生异常的位置之前验证变量。inputArray2
0赞 Tom Clabault 6/13/2017
如何发布nullString?我必须编辑我的第一篇文章吗?
0赞 Paul Ogilvie 6/13/2017
是的,编辑您的帖子以包含该功能。
0赞 Tom Clabault 6/13/2017
完成,我编辑了帖子

答:

0赞 Sokre 6/13/2017 #1

尝试使用

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

而不是 nullString() 和 for()something[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 是无符号字符类型。因此,您正在尝试存储 8 个字节 (sizeof longlong = 8),并且您只为一个字节保留了位置 (sizeof char = 1)

将 inputArray2 重新声明为 long long

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);

评论

0赞 Tom Clabault 6/13/2017
inputSize / 2 给了我确切的值,除了,在那个级别没有问题,所以我保留了 inputArray2 = malloc(...) 原样感谢 string_temp[3] = { 0 },现在是 string_temp[3] = { 0, 0, 0 } Memset(因为我在 Windows 10 和 Visual Studio 下)没有帮助,同样的错误,但在执行 memset 时。我还用 if(... == NULL) 检查了 malloc,没问题,malloc 很好......
0赞 Sokre 6/13/2017
你现在从哪里得到错误?在 memset() 中,您现在使用它而不是 nullString();或者以后,当你尝试 inputArray2[i] = strtoll();
0赞 Tom Clabault 6/13/2017
错误在memset()中,我不再使用nullString了。如果我注释 memset(),则错误出现在“inputArray2[i] = strtoll(string_temp, NULL, 16);”
1赞 SiggiSv 6/13/2017
“然后,这不会使所有数组归零:”是的,确实如此。请参见:stackoverflow.com/a/2589751/4766261unsigned char string_temp[3] = { 0 };
4赞 SiggiSv 6/13/2017 #2

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

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

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