shuaishuaitz 2024-02-09 17:07 采纳率: 100%
浏览 6
已结题

C语言编程中赋值有问题,无编译错误

本人使用codeblocks进行C语言编程,程序运行没有编译错误,但是中间的赋值出现了意料之外的情况。
对于zj[c].bq明明只进行了赋值运算,且只有赋值1和-1两种情况,然而测试用例中 zj[7].bq=10。(其他的都是正常的)
以下是部分代码(错误发生在其中)

#include<stdio.h>
struct node{
    int n;
    int bq;
};

signed main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n,m,k;
        scanf("%d %d %d",&n,&m,&k);
        int a[n];int b[m];
        struct node zj[k];int c=0;
        for(int i=0;i<n;++i){
            scanf("%d",&a[i]);
            if(a[i]<=k){
                zj[c].n=a[i];zj[c].bq=-1;c++;
            }
        }
        for(int i=0;i<m;i++){
            scanf("%d",&b[i]);
            if(b[i]<=k){
                zj[c].n=b[i];
                zj[c].bq=1;
                printf("zj[%d].n=%d,zj[%d].bq=%d\n",c,zj[c].n,c,zj[c].bq);
                c++;
            }
        }
        for(int i=0;i<c;i++){
            printf("zj[%d].n=%d,zj[%d].bq=%d\n",i,zj[i].n,i,zj[i].bq);
        }

以下是测试用例:
1
6 5 6
2 3 8 5 6 5
1 3 4 10 5
以下是输出结果:

zj[5].n=1,zj[5].bq=1
zj[6].n=3,zj[6].bq=1
zj[7].n=4,zj[7].bq=1
zj[8].n=5,zj[8].bq=1
zj[0].n=2,zj[0].bq=-1
zj[1].n=3,zj[1].bq=-1
zj[2].n=5,zj[2].bq=-1
zj[3].n=6,zj[3].bq=-1
zj[4].n=5,zj[4].bq=-1
zj[5].n=1,zj[5].bq=1
zj[6].n=3,zj[6].bq=1
zj[7].n=4,zj[7].bq=10
zj[8].n=5,zj[8].bq=1
```(只能用代码块展示,实际上是输出数据)

代码中两个printf之间明明没有其他运算,然而第一个循环的输出中zj[7].bq=1,第二个循环的输出中zj[7].bq=10
  • 写回答

3条回答 默认 最新

  • 叫兽-郭老师 新星创作者: Java技术领域 2024-02-09 17:09
    关注

    参考通义千问和郭老师的小迷弟雅思莫了-编写提供,您可以参考如下,如果回答的不正确,及时评论区回复我,我会根据你错误描述追加回复。如果解决了您的问题,麻烦帮我点击个采纳!谢谢您的肯定!

    从你提供的信息来看,问题可能出在内存溢出或者变量作用域上。在你的代码中,zj 数组的大小是 k,但在读取输入时可能会超过这个范围,导致对数组的越界访问。这可能会修改到其他原本不应该被修改的数据。

    在给定的测试用例中,k = 5,但你在第一个循环结束后已经将 c 增加到了 6,然后在第二个循环中继续增加 c。当 c 达到或超过 5 时,你就在访问数组 zj 的未定义区域了。这可能导致不可预测的结果,包括修改到之前已经赋值过的元素。

    为了解决这个问题,你需要确保在添加新节点到 zj 时不超出其边界。你可以通过以下方式更新你的代码:

    #include<stdio.h>
    struct node{
        int n;
        int bq;
    };
    
    signed main(){
        int t;
        scanf("%d",&t);
        while(t--){
            int n, m, k;
            scanf("%d %d %d",&n,&m,&k);
            int a[n];
            int b[m];
            struct node zj[k];
            int c = 0;
    
            // 添加检查以避免越界
            for(int i = 0; i < n && c < k; ++i){
                scanf("%d",&a[i]);
                if(a[i] <= k){
                    zj[c].n = a[i];
                    zj[c].bq = -1;
                    c++;
                }
            }
    
            for(int i = 0; i < m && c < k; i++){
                scanf("%d",&b[i]);
                if(b[i] <= k){
                    zj[c].n = b[i];
                    zj[c].bq = 1;
                    printf("zj[%d].n=%d,zj[%d].bq=%d\n", c, zj[c].n, c, zj[c].bq);
                    c++;
                }
            }
    
            for(int i = 0; i < c; i++){
                printf("zj[%d].n=%d,zj[%d].bq=%d\n", i, zj[i].n, i, zj[i].bq);
            }
        }
    }
    

    现在,你的代码会在尝试添加新节点到 zj 时检查是否已达到数组的界限,从而防止越界。这应该可以解决你遇到的问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月17日
  • 已采纳回答 2月9日
  • 创建了问题 2月9日