C 为什么我的strlen函数保持“0”;撞车;?

C 为什么我的strlen函数保持“0”;撞车;?,c,crash,strlen,C,Crash,Strlen,我正试图用C编写一个strlen函数,但它不起作用 int strlen(char*string) { int length=0; while(length[string]!='0') { ++length; } free(string); return length; } 无论我运行编译器多少次,它都会不断崩溃。我的代码出了什么问题?您可能有空闲的内存,而该函数并不拥有这些内存 例如: strlen("42"); 将崩溃,因为

我正试图用C编写一个strlen函数,但它不起作用

int strlen(char*string)
{
    int length=0;
    while(length[string]!='0')
    {
        ++length;
    }
    free(string);
    return length;
}

无论我运行编译器多少次,它都会不断崩溃。我的代码出了什么问题?

您可能有
空闲的
内存,而该函数并不拥有这些内存

例如:

strlen("42");
将崩溃,因为
“42”
是字符串文本-您无法修改它

请注意,
'0'
不是字符串的终止字符,而是实际的
'0'
字符。使用
'\0'
0

卸下免费的
,它应该可以工作


我还想使用更为惯用的
string[length]
,如果
string==NULL
,这是非法的,因此空检查是有序的。

它在哪里崩溃?为什么要释放接收到的指针?这样,在使用函数检索字符串长度后,就不允许对其执行任何操作

或者,如果您在未使用
malloc
分配的内存块上调用
free
,或者在堆栈上调用,那么您处于未定义行为的境地,应该庆幸它崩溃了


具体地说,使用诸如
strlen(“test”)
之类的调用“测试”您的方法将使您的程序崩溃,因为
char*
不是使用
malloc
分配的,它崩溃是因为我猜指针没有分配给任何动态分配的对象(使用
malloc
创建的对象)。仅仅因为它是一个指针,并不能保证它被分配给使用
malloc
分配的对象,因此必须被释放。指针可以指向对象(不一定是动态分配的对象),在本例中,我假设指针设置为字符串文本(
“Hello World”
)。指针及其点ee在堆栈上分配,无需删除<在这种情况下,code>free
是不必要的,因为它们都将在各自作用域的末尾被销毁。此外,使用
malloc
创建的任何内容都必须删除/释放,否则可能会导致内存泄漏。否则,释放未分配给使用
malloc创建的对象的指针将导致未定义的行为,其中可能包括崩溃。

您的
循环不应与
'0'进行比较
'0'
(ascii)是值48

字符串不以48结尾。
字符串以0结尾

你应该做:

while(length[string] != 0)

(关于代码中其他问题的所有其他答案和注释也都是准确的)

没关系,当我摆脱免费和“0”时,它就可以工作了

int strlen(char*string)
{
    int length=0;
    while(length[string]!='\0')
    {
        ++length;
    }
    return length;
}
尝试使用

while(string[length]!=0)

长度[字符串]
?仅仅因为它有效,并不意味着你应该这么做!有什么特别的原因让你
free()。同样,
'\0'
。[filler]更糟糕的是,
free()
可能被应用到从未
malloc
'd或动态分配的内存中,这是一件非常糟糕的事情。@sftrabbit true,没有做到这一点。哇,这是一个快速(完整)的答案。我不同意答案中的“空检查是有序的”部分。
strlen
函数需要指向以零结尾的字符串的指针。NULL只是数十亿无效输入中的一个。测试这种特定的无效输入并没有什么好处。如果您想要的是一种安全的语言,那么就使用它(在这种语言的实现中,通常不需要空测试)。到处都是空测试的C仍然是不安全的,因为它被稀释了,所以读起来很不舒服,而且所有的检查甚至会使它比安全的、可优化的对应项慢。除了它不会返回字符串的长度。不,请读答案…两者都是等价的,但这是一个公平的建议。没有理由认为
'0'
应该是48。它可能是,也可能不是,但这完全无关。@KerrekSB:什么是“0”重要吗?不管它的价值如何,它都是错误的。(在这家伙使用的大多数系统上,很可能是48)