3

我正在尝试用strlenC 编写一个函数,但它不起作用。

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

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

4

6 回答 6

15

您的while循环不应该与'0'.
'0'(ascii) 的值为 48!

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

你应该这样做:

while(length[string] != 0)

(以及关于代码中其他问题的所有其他答案和评论也是准确的)

于 2012-12-28T20:50:32.630 回答
14

您可能正在free记忆该功能不拥有的记忆。

例如:

strlen("42");

会崩溃,因为"42"它是一个字符串文字 - 你不能修改它。

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

删除free它应该可以工作。

我也会选择更惯用string[length]的,当心,这是非法的,如果string == NULL- 所以在那里进行空检查。

于 2012-12-28T20:47:57.127 回答
4

它崩溃是因为我猜测指针没有分配给任何动态分配的对象(使用创建的对象malloc)。仅仅因为它是一个指针并不能保证它被分配给分配的东西malloc,因此必须被释放。指针可以指向对象(不一定是动态分配的),在这种情况下,我假设指针设置为字符串文字("Hello World")。指针及其指向对象在堆栈上分配,无需删除。free在这种情况下是不必要的,因为它们都将在各自范围的末尾被破坏。此外,您创建的任何内容都malloc 必须被删除/释放,否则您将面临内存泄漏的风险。否则释放一个未分配给用的东西的指针malloc导致未定义的行为,其中可能包括崩溃。

于 2012-12-28T20:48:51.417 回答
4

没关系,当我摆脱免费和“0”时,它起作用了!!

int strlen(char*string)
{
    int length=0;
    while(length[string]!='\0')
    {
        ++length;
    }
    return length;
}
于 2012-12-28T20:51:36.923 回答
3

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

或者,如果您正在调用free未使用malloc、 在堆栈或其他任何地方分配的内存块,那么您处于未定义行为的领域,应该很高兴它崩溃了。

特别是使用类似调用“测试”您的方法strlen("test")会使您的程序崩溃,因为char*没有使用malloc.

于 2012-12-28T20:48:08.697 回答
2

尝试使用

while(string[length]!=0)
于 2012-12-28T20:51:40.260 回答