C++ 在main中搜索字符串的结尾时出现分段错误,但在函数C+中未搜索+;

C++ 在main中搜索字符串的结尾时出现分段错误,但在函数C+中未搜索+;,c++,string,segmentation-fault,C++,String,Segmentation Fault,我正在尝试实现一个简单的字符串长度函数。如果我把所有东西都写在main中,代码就会出错。但是,如果我声明了strlen函数,那么它就不会。为什么会这样 为什么下面的代码可以工作 using namespace std; #include <iostream> int strlen(char *s) { char *p = s; while (*p != '\0') p++; return p - s; } int main() {

我正在尝试实现一个简单的字符串长度函数。如果我把所有东西都写在main中,代码就会出错。但是,如果我声明了strlen函数,那么它就不会。为什么会这样

为什么下面的代码可以工作

using namespace std;
#include <iostream>

int strlen(char *s)
{
    char *p = s;
    while (*p != '\0')
        p++;
    return p - s;
}


int main()
{
    char *s;
    cin >> s;
    cout << strlen(s) << endl;
}
使用名称空间std;
#包括
整数strlen(字符*s)
{
char*p=s;
而(*p!='\0')
p++;
返回p-s;
}
int main()
{
char*s;
cin>>s;
库特;
char*p=s;
而(*p!='\0')
p++;

CUT< P>您没有分配任何内存用于<代码> S/<代码>。它之所以在一个案例中工作,而不是因为它在C++中定义了不可定义的行为的奇迹。

< P>您没有分配任何内存用于<代码> S/<代码>。它在一个案例中工作的原因,而不是另一个原因,可能是因为C++中未定义行为的奇迹。

两个程序都显示UB,因为
s
是悬挂(未分配)在这两种情况下都是指针。一个示例似乎有效,而另一个则崩溃。此外,请小心使用
strlen
等名称。有
strlen
来自
string.h
cstring
std::strlen
来自
cstring
,其中任何一个都可能被其他std库头包含。因此,最好将函数放在名称空间中。两个程序都显示UB,因为
s
是一个悬空(未分配)在这两种情况下都是指针。一个示例似乎有效,而另一个则崩溃。此外,请小心使用
strlen
等名称。有
strlen
来自
string.h
cstring
std::strlen
来自
cstring
,其中任何一个都可能被其他std库头包含。因此,最好将函数放在名称空间中。删除“可能”删除“可能”
using namespace std;
#include <iostream>

int main()
{
    char *s;
    cin >> s;
    char *p = s;
    while (*p != '\0')
        p++;
    cout << p-s << endl;
}