为什么使用 char* 指针在 C 中读取字符串的一种方法有效,而其他方法无效?

Why one method of reading string in C using char* pointer works while other doesn't?

我正在使用指针读取C中的字符串,通过以下两种方法,两者完全相同(至少在我看来是这样)。唯一的区别是在一种方法中我做了一个专门的函数来完成这项工作。

方法 1: // 按预期工作

#include <stdio.h>

int main()
{
    char *str;
    char delimiter='.';
    int len=0;
    
    scanf("%c",(str+len));
    while(*(str+len)!=delimiter)
    {   
        ++len;
        scanf("%c",(str+len));
    }
    ++len;
    *(str+len)='[=10=]';

    printf("%s",str);

    return 0;
}

方法二: // 不行,屏幕上什么也打印不出来

#include <stdio.h>

int readString(char *str,char delimiter)
{
    int len=0;
    
    scanf("%c",(str+len));
    while(*(str+len)!=delimiter)
    {   
        ++len;
        scanf("%c",(str+len));
    }
    ++len;
    *(str+len)='[=11=]';

    return len;
}

int main()
{
    char *str;
    
    int len=readString(str,'.');

    printf("%s",str);

    return 0;
}

我完全不知道自己做错了什么。

在进一步使用方法 2 中的代码时,我观察到我是否只是在行 char *str;int len=readString(str,'.'); 之间声明一个带有初始化(如 int useless=-1;)的变量(甚至无用)代码工作正常。

这让我更加头疼。

谁能解释一下到底是怎么回事?

我的猜测是它必须对悬挂指针做一些事情,但如果是这种情况,方法 1 也应该失败。

在第一个代码中

 scanf("%c",(str+len));

您正在尝试写入(访问)无效的内存位置。注意 str 实际上是未初始化的,即它没有指向任何有效的内存位置。因此,程序调用 undefined behaviour 并且结果无法以任何方式证明是合理的。

在第二个代码中,存在同样的问题,因此行为再次未定义。