C:printf char*返回奇怪的最后一个字符

Jea*_*ond 1 c arrays printf pointers

我试图理解为什么我的后面会有一个奇怪的角色 printf()

char* extract_word()
{
    char* sentences = "hi! i'm a banana!";
    int starts = 4;
    int ends   = 12;
    int count;
    int nb_char = ends-starts+1;
    char* word = malloc(nb_char);
    printf("\n\n%d\n",ends-starts);
    for(count = starts; count < ends;count++)
    {
        word[count-starts] = sentences[count];
        printf("%c == \n",sentences[count]);
    }
    word[count-starts+1] = '\0';
    printf("\n\n%s",word);
    return word;
}
Run Code Online (Sandbox Code Playgroud)

printf回报:

8

i ==
' ==
m ==
  ==
a ==
  ==
b ==
a ==

i'm a bau
Run Code Online (Sandbox Code Playgroud)

如果我删除了'\0'我得到的东西:

   'm a ba¨Á£´
Run Code Online (Sandbox Code Playgroud)

Sou*_*osh 6

在你的代码中

   word[count-starts+1] = '\0';
Run Code Online (Sandbox Code Playgroud)

一个接一个,基本上,越界访问调用未定义的行为.

您应该将代码更改为

   word[nb_char-1] = '\0';
Run Code Online (Sandbox Code Playgroud)

因为,你已经分配了nb_char字节,最后一个索引就是nb_char-1.

也就是说,在使用返回的指针之前,总是需要malloc()通过检查返回来检查是否成功NULL.