如何在C中获取初始化的非顺序数组索引

时间:2019-03-29 10:59:54

标签: c arrays clang

我来自高级语言,试图学习C语言,并提高我对低级内容工作方式的了解。

所以我试图了解如何仅获取初始化的数组索引。 它们可能是非顺序的,因此简单地遍历数组将无法完成工作。

因此,假设我们有一个大小为20的整数数组, 该数组中只有几个元素已初始化为值'1'

我怎么知道哪些索引已经初始化?

#include <stdio.h>

int main() {
    int data[20];

    data[1] = 1;
    data[5] = 1;
    data[8] = 1;
    data[16] = 1;

    return 0;
}

那么在上面的示例中,如何得到1,5,8,16作为结果? 这甚至是在C中使用数组的正确方法吗?

3 个答案:

答案 0 :(得分:3)

它不记得哪些初始化了,哪些没有初始化。在您的示例中,您可以将它们全部初始化为0,然后检查所有不是0的值。

int main() {
    int data[20] = {0};

    data[1] = 1;
    data[5] = 1;
    data[8] = 1;
    data[16] = 1;

    for (int i = 0; i < 20; i++) {
        if (data[i]) {
            printf("data[%d] is initialized to %d\n", i, data[i]);
        }
    }
    return 0;
}

此打印:

data[1] is initialized to 1
data[5] is initialized to 1
data[8] is initialized to 1
data[16] is initialized to 1

说明:int data[20] = {0};告诉它将第一个元素显式初始化为0,其余元素默认初始化(0的{​​{1}})。因此int会将第一个元素设置为int data[20] = {5};,但其余元素仍设置为5

答案 1 :(得分:1)

数组的其余元素将包含完全随机的值,可能为1,因此您可能会发现超过4个包含1作为值的元素。

要初始化数组,您必须对其进行迭代或使用memset(data, 0, sizeof(data))

在某些元素中设置1的方式是更多的分配而不是初始化。

答案 2 :(得分:0)

在C中,数组本身包含值,而不是对值的引用。对于您的int data [20],将在堆栈中分配20个插槽,每个插槽保存类型为int的单个值。分配的插槽不会清除,因此数组元素的初始值将是以前使用它们的人存储在这些堆栈插槽中的数据。您为数组元素所做的分配,例如data[8] = 1;不会初始化数组元素,它们只是将元素的当前值替换为新值。

换句话说,数组的所有元素都在数组声明后立即初始化。在您的特定情况下,它们会使用堆栈中的一些垃圾值进行初始化。如果要使用某些特定值初始化它们,则应使用数组初始化器,如下所示:

int data[20] = {
  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19
};

这同样适用于非数组变量。与某些其他语言(例如Java)约定,您可以在声明后初始化变量,但只能在声明内进行初始化。所以:

int a = 13; // Initialize to 13
int b; // Initialize to garbage from stack

a = 11; // Just assignment, not initialization
b = 17; // Yet another assignment, not initialization