由于我不太了解我遇到的整体问题,因此调试变得非常困难。
Uncaught Error: The node to be removed is not a child of this node: [object HTMLElement]
我获得了输出:
char *o_key_pad = (char*)malloc(SHA256_DIGEST_LENGTH*sizeof(char));
for(int i = 0; i < SHA256_DIGEST_LENGTH; i++){
o_key_pad[i] = 'a';
}
printf("%s\n", o_key_pad);
char *i_key_pad = (char*)malloc(SHA256_DIGEST_LENGTH*sizeof(char));
for(int i = 0; i < SHA256_DIGEST_LENGTH; i++){
i_key_pad[i] = 'b';
}
printf("%s\n", o_key_pad);
printf("%s\n", i_key_pad);
为什么数组'o_key_pad'被扩展为包含我放入数组'i_key_pad'中的任何内容,看起来像某种内存问题?
注意:我知道它可以更有效地完成,但为了更清楚地表明我的观点,我已经这样做了。
答案 0 :(得分:3)
printf
不知道在哪里停止。 C风格的字符串如下(以下两行是等效的;在引号[a“string literal”]中写一个字符串会自动创建一个以空字符结尾的字符数组):
char str[] = "hello world";
char str2[] = { 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\0' };
这就是你的代码应该是这样的:
int i;
char *o_key_pad = malloc(SHA256_DIGEST_LENGTH * sizeof (char) + 1);
for (i = 0; i < SHA256_DIGEST_LENGTH; ++i) {
o_key_pad[i] = 'a';
}
o_key_pad[i] = '\0';
printf("%s\n", o_key_pad);
char *i_key_pad = malloc(SHA256_DIGEST_LENGTH * sizeof (char) + 1);
for (i = 0; i < SHA256_DIGEST_LENGTH; ++i) {
i_key_pad[i] = 'b';
}
i_key_pad[i] = '\0';
printf("%s\n", o_key_pad);
printf("%s\n", i_key_pad);
/* Don't forget to free when done. */
free(o_key_pad);
free(i_key pad);
答案 1 :(得分:2)
你有char
个数组,但它们没有空间容纳字符串终结符,实际上你没有附加一个。因此,内容不是正确的C字符串。当你对printf()
撒谎时,任何事情都可能发生,但实际上,超出数据预期范围的打印可能就是结果。
如果您不想添加终结符,则可以将最大字段宽度放入格式:
printf("%.32s\n", o_key_pad);
,或者
printf("%.*s\n", SHA256_DIGEST_LENGTH, o_key_pad);
如果您不想直接将字段宽度硬编码为格式。
答案 2 :(得分:1)
您的字符串不是以NULL结尾的,因此在传递给printf
时会导致未定义的行为。您可以再分配一个字节并添加NULL字符,也可以为字符串指定最大字段宽度。