由于我并不真正了解我遇到的整体问题,因此调试变得非常困难。
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("%sn", 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("%sn", o_key_pad);
printf("%sn", i_key_pad);
我获得输出:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
为什么数组"o_key_pad"被扩展为包含我在数组"i_key_pad"中放入的任何内容,似乎是某种内存问题?
注意:我知道它可以更有效地完成,但为了更清楚地表明我的观点,我这样列出它。
printf
不知道在哪里停止,除非你正确地将字符串终止为空。C 样式字符串如下所示(以下两行是等效的;用引号编写字符串 ["字符串文字"] 会自动创建以 null 结尾的字符数组):
char str[] = "hello world";
char str2[] = { 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', ' ' };
您的代码应该如下所示:
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] = ' ';
printf("%sn", 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] = ' ';
printf("%sn", o_key_pad);
printf("%sn", i_key_pad);
/* Don't forget to free when done. */
free(o_key_pad);
free(i_key pad);
你有char
数组,但它们没有空间容纳字符串终止符,事实上你没有附加一个。 因此,内容不是正确的 C 字符串。 当你对printf()
撒谎时,任何事情都可能发生,但实际上,超出数据的预期范围进行打印是可能的结果。
如果您不想添加终止符,则可以在格式中输入最大字段宽度:
printf("%.32sn", o_key_pad);
,或者
printf("%.*sn", SHA256_DIGEST_LENGTH, o_key_pad);
如果您不想将字段宽度直接硬编码为格式。
您的字符串不是以 NULL 结尾的,导致在传递给 printf
时出现未定义的行为。您可以再分配一个字节并添加 NULL 字符,也可以为字符串指定最大字段宽度。