这个简单的C代码发生了什么?

mst*_*agg 0 c string

我正在自学C语言.我有以下代码,通过char向前和向后打印字符串char:

#include<stdio.h>
#include<string.h>

main(){
    char *str; 
    fgets(str, 100, stdin);
    //printf("%i", strlen(str));
    int i;

    for(i = 0; i < strlen(str) - 1; i++){
        printf("%c", str[i]);
    }
    for(i = strlen(str); i > -1; i--){
        printf("%c", str[i]);
    }
}
Run Code Online (Sandbox Code Playgroud)

运行时,它给我以下输出(假设我输入"hello"):

cello
ollec
Run Code Online (Sandbox Code Playgroud)

另外,如果我取消注释第7行代码,我得到以下输出(假设我输入"hello"):

6 ?
Run Code Online (Sandbox Code Playgroud)

对于我的生活,我无法弄清楚我正在做什么导致输出中的第一个字符发生变化.在第二个例子中,我知道字符串长度为6,因为'h'+'e'+'l'+'l'+'o'+'\ 0'= 6.这很好,但是在哪里锹符号来自?为什么只打印其中一个?

对我来说很明显,我对这里发生的事情有一些基本的误解,我无法在其他地方找到任何这方面的例子.任何人都可以解释这里出了什么问题吗?

Win*_*ute 5

你永远不会为字符串分配内存.代替

char *str;
Run Code Online (Sandbox Code Playgroud)

使用

char str[100];
Run Code Online (Sandbox Code Playgroud)

这样你就有足够的空间容纳你在那里通过fgets电话阅读的最多100个字符.