为啥我的 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】:
您可能是free
ing 函数不拥有的内存。
例如:
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 函数总是“崩溃”? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章