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

问题描述

我正在通过指针通过以下两种方法使用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)='\0';

    printf("%s",str);

    return 0;
}

方法2: //不起作用,屏幕上没有任何内容打印

#include <stdio.h>

int readString(char *str,char delimiter)
{
    int len=0;
    
    scanf("%c",(str+len));
    }
    ++len;
    *(str+len)='\0';

    return len;
}

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

    printf("%s",str);

    return 0;
}

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

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

这进一步加剧了我的头痛。

有人可以解释真实情况吗?

我的猜测是它必须对悬空的指针执行某些操作,但是如果是这种情况,方法1也应该失败。

解决方法

在第一个代码中

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

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

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