C语言 打印字符数组时出现问题



由于我并不真正了解我遇到的整体问题,因此调试变得非常困难。

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 字符,也可以为字符串指定最大字段宽度。

相关内容

  • 没有找到相关文章

最新更新