空数组的元素是否为 NULL 值?

Are are elements of an empty array NULL valued?

我尝试了这个 Armstrong 程序,但发现自己陷入了这个空数组的问题中。这个程序的工作已经困扰我一段时间了,但似乎仍然无法弄清楚这里出了什么问题。是的,所以只想问一下空数组或不完整数组的元素赋值是多少?它是 NULL 字符,即“\0”吗?我尝试在在线 C 编译器上检查它,这个断言似乎是正确的,但 GCC 告诉我们相反的情况。我尝试了这种方法来解决 Armstrong 问题,这是我的代码:

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

int main()
{
    int num,i,cub,j;
    i = cub = 0;
    int sto[20];
    scanf("%d",&num);
    j = num;
    while(num != 0) 
    {
        sto[i] = num%10;
        num = num / 10;
        i++;
    }
    i = 0;
    while(sto[i] != '[=10=]')
    {
       cub += pow(sto[i],3);
       i++;
    }
    num = j;
    printf("cub: %d     num: %d\n\n",cub,num);
    if(j == cub)
      printf("The number is an Armstrong number");
    else 
      printf("The number is not an Armstrong number");

    return 0;
}

我知道有其他方法可以解决这个问题,但我正在寻找的是上述问题的答案。

该数组中的值将是未定义的。它们可能为零,它们可能是上次使用堆栈的那部分时恰好存在的任何值。同样的原理也适用于堆内存。

so just wanted to ask what value are the elements of an empty or incomplete array assigned to? Is it the NULL character i.e. '[=10=]'?

不,当像您在此处所做的那样在函数主体中声明时(即没有初始化程序),内容是未定义的。实际上,这些值将是最后一次出现在堆栈中这些位置的随机数据。当像您在此处所做的那样声明“自动”数组时,编译器只是插入一个堆栈增量以保留 space,但不执行任何其他操作。它可能为零,但可能不是。

您在没有存储说明符的块范围内声明了一个数组static

int sto[20];

这样的数组有自动存储期限。那就是退出定义它的块后它就不会活着。

如果您在文件范围内声明数组,例如在函数 main 之前或在块中使用存储说明符 static,它将具有静态存储持续时间。

来自C标准(6.7.9初始化)

10 If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate. If an object that has static or thread storage duration is not initialized explicitly, then:

— if it has pointer type, it is initialized to a null pointer;

— if it has arithmetic type, it is initialized to (positive or unsigned) zero;

— if it is an aggregate, every member is initialized (recursively) according to these rules, and any padding is initialized to zero bits;

— if it is a union, the first named member is initialized (recursively) according to these rules, and any padding is initialized to zero bits;

C 没有结束标记,程序员应该处理它。参考这个link:

建议:在数组中添加一个结束标记,例如,在数组末尾插入'x',然后循环直到找到标记。或者像这段代码一样使用计数器变量。

 #include <stdio.h>
    #include <math.h>
    
    int main()
    {
        int num,i,cub,j;
        i = cub = 0;
        int sto[20];
        scanf("%d",&num);
        j = num;
        while(num != 0) 
        {
            sto[i] = num%10;
            num = num / 10;
            i++;
        }
        int counter = 0;
        while(counter < i)
        {
           cub += pow(sto[counter],3);
           counter++;
        }
        num = j;
        printf("cub: %d     num: %d\n\n",cub,num);
        if(j == cub)
          printf("The number is an Armstrong number");
        else 
          printf("The number is not an Armstrong number");
    
        return 0;
    }

我希望这能回答你的问题。

sto 的初始值是 indeterminate - 它们几乎可以是任何东西,并且每次您 运行 该代码时它们都可以不同。

如果您想确保所有元素都包含特定值,您可以:

  • 显式初始化所有 20 个元素;
  • 显式初始化一些元素,其余元素隐式初始化为0;
  • 使用 static 关键字声明数组以将所有元素隐式初始化为 0(尽管这改变了数组的分配和存储方式);

如果您希望所有元素最初都是 0,您可以执行以下操作之一:

int sto[20] = {0}; // explicitly initializes first element to 0, implicitly 
                   // initializes remaining elements to 0

static int sto[20]; // implicitly initializes all elements to 0, *but*
                    // changes how sto is stored

如果您希望将所有元素初始化为 0 以外的其他内容,那么您要么需要显式初始化所有元素:

int sto[20] = {-1, -1, -1, -1, -1, ... };

或使用循环:

for ( size_t i = 0; i < 20; i++ )
  sto[i] = -1; // or whatever initial value