c - 如果内存未分配给字符串,则 CS50.h 分段错误
问题描述
在处理 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);
}
解决方案
尽我所能了解 CS50.h 字符串,我才知道
string output
只是声明一个名为 output 的字符指针。因此,在您的代码中实际发生的是,除非您明确声明“strlen(input)+1”连续内存位置只属于输出,否则它们本质上是程序的空闲位置。因此,您的输出指针将仅包含第 0 个索引处的字符。该函数返回实际的“输出”,一个指针。同时,程序中的某些进程可能会使用除输出 [0] 之外的所有其他内存位置,因为它们从不属于输出字符串。输出仅指向某个字符串的第一个字符。
C、C++ 中的边界检查基本上是由程序员完成的。任意 i 的 output[i] 永远不会出错,因为它是程序员的简单指针算法,即 output[i] = *(output+i)。:)
推荐阅读
- mysql - 如何仅实现子类专业化 EER
- python-3.x - 在不使用 end="" 的情况下将返回的字符串连接成单行 python
- javascript - 使用 js 的验证没有更新到 span
- python - 如何为python中的变量分配返回值?
- c++ - 在 C++ 中实现字符串比较时出错
- c# - 如何从 DataTable 中删除直到某个日期的行?
- python - 当列表相同时,Python all() 函数不指示 true
- r - R中的MICE:为什么被动插补结果会受到列位置的影响?
- c# - 默认情况下,.Net Core 中的 String 是不可序列化的吗?
- python - 有没有使用turtle模块返回鼠标位置的函数?