打印一系列字符时遇到问题?

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

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

我获得了输出:

 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 

为什么数组’o_key_pad’扩展到包含我放在数组’i_key_pad’中的任何内容,看起来像某种内存问题?

注意:我知道它可以更有效地完成,但为了更清楚地表明我的观点,我已经这样做了。

printf不知道在哪里停止,除非你正确地终止你的字符串。 C风格的字符串如下(以下两行是等效的;在引号[a“string literal”]中写一个字符串会自动创建一个以null结尾的字符数组):

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

你有char数组,但它们没有空间用于字符串终止符,实际上你没有附加一个。 因此,内容不是正确的C字符串。 当你对printf()撒谎时,任何事情都可能发生,但实际上,超出数据预期范围的打印可能会产生结果。

如果您不想添加终结符,则可以将最大字段宽度放入格式中:

 printf("%.32s\n", o_key_pad); 

或者

 printf("%.*s\n", SHA256_DIGEST_LENGTH, o_key_pad); 

如果您不想直接将字段宽度硬编码为格式。

您的字符串不以NULL结尾,导致传递给printf时出现未定义的行为。 您可以再分配一个字节并添加NULL字符,也可以为字符串指定最大字段宽度。