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