C 为什么我的strlen函数保持“0”;撞车;?
我正试图用C编写一个strlen函数,但它不起作用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"); 将崩溃,因为
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)