首页 > 解决方案 > 如果内存未分配给字符串,则 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);
}

标签: csegmentation-faultmalloccs50c-strings

解决方案


尽我所能了解 CS50.h 字符串,我才知道

string output

只是声明一个名为 output 的字符指针。因此,在您的代码中实际发生的是,除非您明确声明“strlen(input)+1”连续内存位置只属于输出,否则它们本质上是程序的空闲位置。因此,您的输出指针将仅包含第 0 个索引处的字符。该函数返回实际的“输出”,一个指针。同时,程序中的某些进程可能会使用除输出 [0] 之外的所有其他内存位置,因为它们从不属于输出字符串。输出仅指向某个字符串的第一个字符。

C、C++ 中的边界检查基本上是由程序员完成的。任意 i 的 output[i] 永远不会出错,因为它是程序员的简单指针算法,即 output[i] = *(output+i)。:)


推荐阅读