为什么我的strlen功能会“崩溃”?

时间:2012-12-28 20:46:27

标签: c crash strlen

我正在尝试在C中编写strlen函数,但它不起作用。

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

无论我运行编译器多少次,它都会继续崩溃。我的代码怎么了?

6 个答案:

答案 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)