【问题标题】:Infinite for loop? ()in c无限循环? () 在 c 中
【发布时间】:2022-01-22 02:25:47
【问题描述】:

i 的值在达到 7 后重置

#include <stdio.h>
int main(){

    char marks[10];
    int i;

    printf("enter the numbers:\n");
    printf("-------------------\n");
    
    for (i=0;i<10;i++)
    {
        printf("%d\n",i);
        printf("element %d-",i);
        scanf("%d", &marks[i]);
    }

    printf("\n all %d",marks);
    printf("\n second %d\n",marks[1]);
return 0;
}

output

【问题讨论】:

  • 请不要显示文字图片。将输出复制并粘贴到您的问题中作为文本,并将其格式化为单独的代码块。为此,您可以edit您的问题。请同时显示输入。
  • scanf("%d", &amp;marks[i]); 调用 未定义的行为,因为您告诉 scanf 期待 int*,但传递的是 char*
  • 您的编译器没有发出任何警告吗?
  • 您正试图将int 读入char 变量,这是未定义的行为。您还可以使用%d 打印marks,这只会以某种不可用的形式打印其地址(或其中的一部分),而不是内容。
  • 您希望printf("\n all %d",marks); 做什么?格式说明符 %d 需要 int 类型的值,但您传递了一个 char 数组,它是指向第一个数组元素的指针。

标签: c for-loop


【解决方案1】:

您已将标记声明为字符数组,并尝试使用 %d 从用户获取输入,它要求输入整数,

 #include <stdio.h>
int main(){

    int marks[10];
    int i;

    printf("enter the numbers:\n");
    printf("-------------------\n");
    
    for (i=0;i<10;i++)
    {
        printf("%d\n",i);
        printf("element %d-",i);
        scanf("%d", &marks[i]);
    }

    printf("\n all %d",marks);
    printf("\n second %d\n",marks[1]);
return 0;
}

另外我不了解 all 的用法,所以我找不到解决方案。如果你想打印一个特定的数字,那么你必须像第二次那样指定它,或者如果你想显示总数,你想添加更多代码来计算数组中元素的总和。

【讨论】:

    【解决方案2】:

    问题来了:

    scanf("%d", &marks[i]);
    

    说明符"%d" 需要一个指向int 的指针,而不是char。通常它会写入 4 个字节,这是int 的典型大小。 因此在第 8 次迭代中,marks 的索引从 7 到 10 的元素被触及。但是,marks[10]marks 数组之外(仅索引 0-9)有效。调用未定义的行为,程序可以做任何事情,从崩溃到无限循环或召唤鼻恶魔。

    要修复程序,请将标记类型更改为int

    int marks[10];
    

    注意: 即使在第一次迭代时也会调用 UB,因为 "%d" 需要一个指向 int 的指针,而 &amp;marks[0] 的类型是 char*。 C 标准未定义此操作,因为 int*char* 在大小和/或表示和/或对齐方式上可能不同。然而,对于现代 CPU,这不太可能发生。

    【讨论】:

    • 啊我真傻啊
    • @AkshatSharma 你并不愚蠢——你犯了一个简单的错误,而 C 语言可能是一种非常无情的语言。如果可以的话,使用更好的编译器,或者启用更多警告——现代编译器会立即警告你这个错误。
    • "召唤鼻恶魔" 从现在开始,我要格外小心溢出检查! :)
    猜你喜欢
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2012-02-27
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    相关资源
    最近更新 更多