我正在尝试在C中编写strlen
函数,但它不起作用。
int strlen(char*string)
{
int length=0;
while(length[string]!='0')
{
++length;
}
free(string);
return length;
}
无论我运行编译器多少次,它都会继续崩溃。我的代码怎么了?
答案 0 :(得分:15)
您的while
循环不应与'0'
进行比较
'0'
(ascii)是值48!
字符串不以48结尾。
字符串以0结尾。
你应该这样做:
while(length[string] != 0)
(以及关于代码中其他问题的所有其他答案和评论也是准确的)
答案 1 :(得分:14)
你可能free
该函数不拥有的内存。
例如:
strlen("42");
会崩溃,因为"42"
是一个字符串文字 - 你无法修改它。
请注意,'0'
不是字符串的终止字符,而是实际的'0'
字符。使用'\0'
或0
。
删除free
,它应该有效。
我也会选择更惯用的string[length]
,如果string == NULL
,提防是非法的 - 所以在那里进行空检查。
答案 2 :(得分:4)
它崩溃是因为我猜测指针没有分配给任何动态分配的对象(用malloc
创建的对象)。仅仅因为它是一个指针并不能保证它被分配给用malloc
分配的东西,因此必须被释放。指针可以指向对象(不一定是动态分配的对象),在这种情况下,我假设指针设置为字符串文字("Hello World"
)。指针及其point-ee在堆栈上分配,无需删除。在这种情况下,free
是不必要的,因为它们都将在各自范围的末尾被破坏。此外,您使用malloc
创建的任何内容都必须被删除/释放,否则您将面临内存泄漏的风险。否则释放未分配给malloc
的指针的指针会导致未定义的行为,可能包括崩溃。
答案 3 :(得分:4)
没关系,当我摆脱了自由和'0'时,它有效!!
int strlen(char*string)
{
int length=0;
while(length[string]!='\0')
{
++length;
}
return length;
}
答案 4 :(得分:3)
它在哪里崩溃?为什么你释放你收到的指针?这样,在使用函数检索字符串后,不允许对字符串执行任何操作。
或者,如果你在一块未使用free
分配的内存上调用malloc
,在堆栈或其他任何东西上,你处于未定义行为的地形,应该很高兴它崩溃。
使用strlen("test")
等调用专门“测试”您的方法会导致您的程序崩溃,因为char*
未使用malloc
分配。
答案 5 :(得分:2)
尝试使用
while(string[length]!=0)