C - 写访问冲突
C - Write access violation
我在 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] = '[=11=]';
}
我把nullString之前的指令都注释掉了,错误依旧
我也验证了变量,它们看起来都不错
编辑 2:
验证 Malloc:
void verifyMalloc(int* pointer)
{
if (pointer == NULL)
{
perror("Erreur");
Sleep(15000);
exit(0);
}
}
尝试使用
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 returns longlong integer 但你的 inputArray2 是 unsigned char 类型。所以你试图存储 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);
我们所看到的一切都在严重暗示您忘记了 #include <stdlib.h>
(并忽略了由此产生的警告)。
当您在同一文件中使用 malloc()
而未包含 stdlib.h
时可能会发生这种情况:
- 编译器认为
malloc()
函数是隐式声明的,这意味着它假设它的 return 类型是 int
(而不是 *void
)。
- 当
sizeof (int)
与 sizeof (*void)
相同时, 可能 有效。但是当 int
是 32 位而指针是 64 位时,由 malloc()
编辑的地址 return 可能会丢失一半的位并指向无效地址。
我在 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] = '[=11=]';
}
我把nullString之前的指令都注释掉了,错误依旧
我也验证了变量,它们看起来都不错
编辑 2: 验证 Malloc:
void verifyMalloc(int* pointer)
{
if (pointer == NULL)
{
perror("Erreur");
Sleep(15000);
exit(0);
}
}
尝试使用
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 returns longlong integer 但你的 inputArray2 是 unsigned char 类型。所以你试图存储 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);
我们所看到的一切都在严重暗示您忘记了 #include <stdlib.h>
(并忽略了由此产生的警告)。
当您在同一文件中使用 malloc()
而未包含 stdlib.h
时可能会发生这种情况:
- 编译器认为
malloc()
函数是隐式声明的,这意味着它假设它的 return 类型是int
(而不是*void
)。 - 当
sizeof (int)
与sizeof (*void)
相同时, 可能 有效。但是当int
是 32 位而指针是 64 位时,由malloc()
编辑的地址 return 可能会丢失一半的位并指向无效地址。