C语言 为什么会出现分段错误(核心转储),这是什么意思?

6jygbczu  于 2023-03-28  发布在  其他
关注(0)|答案(1)|浏览(134)

我试图运行这段代码,我从用户那里得到输入“消息”,并将该消息转换为二进制代码。我后来用emoji将其打印为1的亮灯泡和0的暗灯泡。然而,我在终端上输入我的输入后一直得到“分割错误(核心转储)”。有人知道为什么吗?在这种特殊情况下,这意味着什么?谢谢!

int main(void)
{
    // prompt for message
    string message = get_string("message: ");
    int len = strlen(message);

    for (int i = 0; i < len; i++)
    {
        int value = message[i];
        int binary_code[BITS_IN_BYTE];

        // convert to binary
        for (int j = 0; j < BITS_IN_BYTE; j++)
        {
            int rem;
            int place = BITS_IN_BYTE - j;
            rem = value % 2;
            binary_code[place] = rem;
            value /= 2;
        }

        // print bulbs
        for (int k = 0; k < BITS_IN_BYTE; k++)
        {
            print_bulb(binary_code[k]);
        }
        printf("\n");
    }
}
cig3rfwq

cig3rfwq1#

至少你的代码有以下问题。
您声明了一个包含BITS_IN_BYTE元素的数组

int binary_code[BITS_IN_BYTE];

因此索引的有效范围是[0, BITS_IN_BYTE)
然而,当j等于0时,在这个for循环中

for (int j = 0; j < BITS_IN_BYTE; j++)
    {
        int rem;
        int place = BITS_IN_BYTE - j;
        rem = value % 2;
        binary_code[place] = rem;
        value /= 2;
    }

然后变量place的值等于BITS_IN_BYTE

int place = BITS_IN_BYTE - j;

因此这一声明

binary_code[place] = rem;

写入数组外部的内存,导致未定义的行为。
您应该按以下方式初始化变量place

int place = BITS_IN_BYTE - j - 1;

相关问题