创建动态字符串时的额外字节

时间:2015-07-27 09:05:37

标签: c string

我编写了一个程序来接受输入并使用IN动态分配内存,但是似乎有一个错误,因为如果我用char打印最后一个字符串char我最后似乎有2个空字节,我相信这将是一件愚蠢的事情,但我花了一些时间试图发现原因并且失败了所以希望在这里学到一些东西。

CASE

3 个答案:

答案 0 :(得分:3)

此循环应该至少看起来像

for(int i = 0; i < count; i++)
                ^^^
    printf("str[%d] = %c\n", i, str[i]);

或者写出

会更好
for(int i = 0; str[i]; i++)
    printf("str[%d] = %c\n", i, str[i]);

或者

int i = 0;
for ( char *p = str; *p; ++p )
    printf( "str[%d] = %c\n", i++, *p );

并更改这些陈述

while(tmp != '\n') {
tmp = getchar();

while ( ( tmp = getchar() ) != EOF && tmp != '\n' )

此外,它会更安全,而不是这句话

str = realloc(str, (count + 0x01) * sizeof(char));

char *p = realloc(str, (count + 0x01) * sizeof(char));
if ( !p ) break;
else str = p;

答案 1 :(得分:3)

这里要提四件事。

  1. while(tmp != '\n')正在读取未初始化的未初始化的自动局部变量值。它调用undefined behaviour

  2. str = realloc(str, (count + 0x01) * sizeof(char));非常糟糕,如果realloc()失败,您也会丢失实际指针。始终使用临时指针来保存realloc()的返回值,并在正确的错误检查后,将其分配回主指针。

  3. sizeof(char)保证为1。您不需要用作乘数。这是多余的。

  4. for循环条件应为i < count,否则,您将遇到一个错误。 C使用基于0的索引。

  5. 那就是说,

    • 在使用返回的指针之前,您应该始终检查realloc()和函数族的返回值是否成功。
    • getchar()会返回int。您应该将tmp的类型更改为int tmp = 0;

答案 2 :(得分:2)

除了未初始化的变量访问外,两个“空字符”是:

  1. 换行符,因为在您阅读并存储下一个字符之前检查\n

  2. 未初始化内存中的字符,因为您在i <= count而不是i < count时错误循环。

  3. 使用for (;;)(无限循环)并在if (tmp == '\n') { break; }之后立即检查getchar(),以避免未初始化的变量访问和尾随换行。