【问题标题】:Program stops working and it says zsh abort程序停止工作并显示 zsh abort
【发布时间】:2022-11-19 01:10:54
【问题描述】:

所以这是我的代码

#include<math.h>
#include<stdio.h>
#include"hw1.h"

int main (int argc, char *argv[]) {
    int num_choices, k; 
    char right_choices[20];
    
    do {
        printf("Enter number of choices:\n");
        scanf("%d", &num_choices);
    }
    while ((num_choices > 26) || (num_choices < 1));

    num_choices = num_choices - 1 + 'A';
    printf("Max choice:%c\n", (char)num_choices);

    printf("Enter answer key:\n");
        for( k=1; k < 20; k++)
        scanf(" %c", &right_choices[20]);


    return 0;
}

虽然编译一切似乎没问题。在运行第二个 scanf 时应该运行 20 次,但每次它在 19 时停止并显示:“zsh abort”

我尝试这样做 10 次以查看是否是问题所在,但第 9 次出现相同的消息。它总是停在 n-1。

同样的代码在linux上完美运行。

非常感谢!

我搜索了问题,但没有找到任何有用的信息

【问题讨论】:

  • 你的循环应该是 for (k = 0; k < 20; ++k)。此外,您通过访问偏移量 20 溢出了 right_choices[] 数组。C 中的数组从索引 0 开始。您是要使用“k”而不是 20 作为索引吗?
  • &amp;right_choices[20] 破坏数组。此外,除了举报外,您不使用num_choices
  • 我也怀疑它是否能在 Linux 上完美运行。 :-)
  • 尝试在出现第一个提示时按 ctrl-d(或在 Windows 中按 ctrl-z return)。 :)
  • 你可能在 Mac 上运行它吗? Linux 可能会告诉您Segmentation fault,而 Windows 只会说Access violation exception。这两者都意味着以下两件事之一:1)空指针异常或 2)你正在踩到未初始化的东西。在这种特殊情况下,它是带有 scanf(" %c", &amp;right_choices[20]); 的 20 长数组的索引 20

标签: c visual-studio-code zsh abort


【解决方案1】:

几乎所有语言中的数组都以相同的方式工作。当您创建 foo[20] 时,这意味着您的数组看起来像 [0][1]...[18][19]

right_choices[20]元素不存在,应该是right_choices[k]

【讨论】:

    【解决方案2】:

    C 是一种索引为 0 的语言,将循环更改为

    for( k=0; k < sizeof right_choices; k++) {
        scanf(" %c", &right_choices[k]);
    }
    

    【讨论】:

    • k &lt;= 19 之前比 k &lt; 20 更好。您引入了另一个幻数,但 20相同的magic number 因为用来定义数组,所以更容易维护或转换为单个引用。
    • 更好,k &lt; sizeof right_choices
    • @Neil 好主意!相应地编辑了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2019-12-10
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 2023-04-11
    相关资源
    最近更新 更多