【发布时间】:2021-02-21 05:38:09
【问题描述】:
在处理 CS50 问题集(替换)时,我在运行代码时遇到了分段错误。经过一番搜索,我发现将内存(malloc)分配给字符串“输出”可以解决问题。但是我想了解为什么这里需要分配内存?
任何解释将不胜感激。
代码提取:-请注意我使用的是 cs50.h 库
string cipher(string input, string key) {
string output=malloc(strlen(input)+1);
for (int i=0, len = strlen(input); i<len; i++) {
if(isalpha(input[i]) != 0) {
output[i] = substitute(input[i], key);
}
else {
output[i] = input[i];
}
}
return output;
free(output);
}
【问题讨论】:
-
这里需要分配内存,原因与尚未分配的每个缓冲区都需要分配内存相同。顺便说一句,你想让你的
return语句在你的free语句之后,而不是在它之前。 -
请注意,C 中没有
string类型。string只是一种误导性的 cs50 编写char *的方式。 -
@goodvibration 感谢您的快速回复。为什么将
output初始化为output = "A....."仍然给我一个分段错误? -
如果你用
output = "A..."替换对malloc的调用,你的指针指向一个不能被修改的字符串字面量。当您通过output[i]=为其赋值时,这是非法的。 -
return output; free(output);这没有任何意义。 1:free在你跳出它之前的函数时永远不会到达。 2:如果你要释放内存,那么调用者在你返回后就不能再使用它了。
标签: c segmentation-fault malloc cs50 c-strings