首页 > 解决方案 > C中初始化数组的默认值

问题描述

我很困惑为什么我的 int 数组的默认值为 1,而我在 C 中修复一个函数。我认为如果未初始化的数组的默认值为 0(或垃圾)。这引起了一些挫败感,因为我使用 int 数组来检查一个数字是否已经用于将一个数组与另一个数组匹配。

非常困惑,直到我决定打印出“已使用”数组并发现我有一些非常大的值,一些 -1 和一堆 1(我最初使用值 1 来查看该插槽是否已用于之前的一场比赛,但没有得到预期的结果。我使用了 12,但这是一个 hack,我想了解对最初未初始化的数组进行检查的最佳方法,然后将其填充。

谁能帮我理清对数组初始化的理解?当我使用“char arr[n] = {0}”时,它不会编译(所以我猜这是因为 c99)但是“char arr[n];”应该可以工作吗?我想我可以使用 memset(arr, '0', n) 用'0'填充它,但这似乎不适用于整数。

bool comp(const int *a, const int *b, size_t n) {
        int used[n];
        //memset(used, 0, n);   
        for (int i = 0; i < n; i++){
                int count = 1;
                for (int j = 0; j < n; j++){
                        int powered = pow(a[j], 2);
                        if (powered == b[i] && used[j] != 12 ) {
                                printf(" Matched at %d: %d %d \n", j, powered, b[i]);
                                count++;
                                used[j] = 12;
                                break;
                        }
                }
                /*for (int i = 0; i < sizeof(used) / sizeof(used[0]); i++){
                        printf("Used has %d\n" , used[i]);
                }*/

                if (count == 1) return false;
        }
        return true;
}

标签: carrays

解决方案


C 语言中任何自动变量的默认值都是未定义的——除非你明确地这样做,否则它不会被初始化为任何东西。它是否是一个数组并不重要——不管它是未初始化的。

所以你需要初始化数组。不幸的是,根据 C99 规范,您不能像这样初始化可变大小的数组,因此您唯一的选择是通过memset在注释中使用 like 或显式分配给每个元素来显式覆盖垃圾。


推荐阅读