为啥我的 strlen 函数总是“崩溃”? [关闭]

Posted

技术标签:

【中文标题】为啥我的 strlen 函数总是“崩溃”? [关闭]【英文标题】:Why does my strlen function keep "crashing"? [closed]为什么我的 strlen 函数总是“崩溃”? [关闭] 【发布时间】:2012-12-14 01:50:56 【问题描述】:

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

int strlen(char*string)

    int length=0;
    while(length[string]!='0')
    
        ++length;
    
    free(string);
    return length;

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

【问题讨论】:

length[string]?仅仅因为它有效,并不意味着你应该这样做! free()ing 一个您可能从未分配过的字符串的任何具体原因? 为什么你认为重新编译它会修复一个编程错误? C 字符串不以 0 digit 结尾,它们以 0 byte 结尾。 错误的free() 调用名为“malloc”的 OP 发布的代码让我发笑。对不起。 【参考方案1】:

您的 while 循环不应与 '0' 进行比较。'0' (ascii) 的值是 48!

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

你应该这样做:

while(length[string] != 0)

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

【讨论】:

'0' 没有理由应该是 48。它可能是,也可能不是,但这完全不相关。 @KerrekSB:“0”是什么有关系吗?不管它的价值如何,它都是错误的。 (在这个人使用的大多数系统上,它最有可能 48)【参考方案2】:

您可能是freeing 函数不拥有的内存。

例如:

strlen("42");

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

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

删除free,它应该可以工作。

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

【讨论】:

另外,'\0'。 [填充] 更糟糕的是,free() 可能被应用到从未被malloc'd 或动态分配的内存,这是一件非常糟糕的事情。 @sftrabbit true,错过了。 哇,这是一个快速(且完整)的答案。 我不同意答案的“一个空检查是为了在那里”的一部分。 strlen 函数需要一个指向以零结尾的字符串的指针。 NULL 只是数十亿个无效输入中的一个。测试这个特定的无效输入会增加样板文件,但几乎没有优势。如果你想要的是一种安全的语言,那么就使用它(在这种语言的实现中,NULL 测试通常是不必要的)。到处都有 NULL 测试的 C 仍然是不安全的,读起来很不愉快,因为它被稀释了,所有的检查甚至可以使它比安全的、可优化的对应物慢。【参考方案3】:

没关系,当我摆脱 free 和 '0' 时它会起作用!!

int strlen(char*string)

    int length=0;
    while(length[string]!='\0')
    
        ++length;
    
    return length;

【讨论】:

除非它不会返回字符串的长度。 不,请阅读答案...【参考方案4】:

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

【讨论】:

【参考方案5】:

它在哪里崩溃?为什么你释放你收到的指针?这样你就不能在用你的函数检索它的长度后对字符串做任何事情。

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

使用strlen("test") 之类的调用专门“测试”您的方法会使您的程序崩溃,因为char* 不是使用malloc 分配的。

【讨论】:

【参考方案6】:

尝试使用

while(string[length]!=0)

【讨论】:

两者是等价的,但这是一个公平的建议。

以上是关于为啥我的 strlen 函数总是“崩溃”? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 QThreads 总是让 Maya 崩溃?

我的应用程序“查找麦克风的音频输入频率”总是崩溃。但为啥?

为啥我的应用程序强制关闭?

为啥我的 Qt 应用程序无故崩溃? [关闭]

如果我不给它提供命令行参数,为啥我的程序会崩溃? [关闭]

为啥检查字符串是不是为空的函数总是返回true? [关闭]