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

时间:2016-03-10 18:00:45

标签: c arrays memory memory-management malloc

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

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'中的任何内容,看起来像某种内存问题?

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

3 个答案:

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