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

问题描述 投票:0回答:1

我正在尝试运行这段代码,从用户那里获得输入“消息”,然后将该消息转换为二进制代码。我后来用表情符号将其打印为 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");
    }
}
arrays c segmentation-fault nested-loops cs50
1个回答
0
投票

至少你的代码存在以下问题

你声明了一个包含

BITS_IN_BYTE
元素的数组

int binary_code[BITS_IN_BYTE];

所以指数的有效范围是

[0, BITS_IN_BYTE)
.

但是当

j
在这个for循环中等于
0

    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;
© www.soinside.com 2019 - 2024. All rights reserved.