在C编程中数组以NULL结尾吗?

w8ntj3qf  于 2022-12-29  发布在  其他
关注(0)|答案(3)|浏览(310)

我是一个C语言的初学者,我被要求计算一个数组的大小,而不使用sizeof运算符。所以我尝试了这个代码,但它只适用于奇数个元素。所有的数组都像字符串一样以NULL结尾吗?

#include <stdio.h>
void main()
{
    int a[] = {1,2,3,4,5,6,7,8,9};
    int size = 0;
    for (int i = 0; a[i] != '\0'; i++)
    {
        size++;
    }
    printf("size=%d\n", size);
}
o4hqfura

o4hqfura1#

不,通常情况下,数组没有默认的标记字符。
作为一种特殊情况,以空终止符(ASCII值0)结尾的数组被称为字符串。然而,这是一种特殊情况,而不是标准情况。

ubof19bj

ubof19bj2#

在C编程中,数组通常不以空值结尾。数组是一个连续的内存块,包含固定数量的相同类型的元素。数组的大小在创建时确定,不能更改。
若要访问数组的元素,可以使用索引。数组的第一个元素位于索引0处,第二个元素位于索引1处,依此类推。数组的大小不与数组一起存储,因此必须自己跟踪它或使用单独的变量来存储它。
如果要表示大小可变且以特殊值结尾的元素列表,可以改用链接列表或以空值结尾的字符串。以空值结尾的字符串是以空字符('\0')结尾的字符序列

weylhg0b

weylhg0b3#

  • 〉所以我尝试了这段代码,但它只适用于奇数个元素。*

用这个数组试试你的代码

int a[] = {1,2,0,4,5,6,7,8,9}; 
               ^
               |
          3 replaced with 0

你会发现输出是size=2,为什么?
因为for循环条件-a[i] != '\0'
那么,当for循环条件达到-a[i] != '\0'时会发生什么呢?
'\0'为整型字符常量,类型为int,与0相同,当a[i]0时,条件变为false,退出循环。
在您的程序中,数组a的元素都没有值0for循环继续迭代,因为条件导致数组的每个元素都为true,您的程序最终访问的数组超出了其大小,这会导致未定义的行为。

  • 〉是否所有数组都像string一样以NULL结尾。*

C中,数组和字符串都不以NULL结尾,相反,字符串实际上是以第一个空字符'\0'结尾并包含该空字符的一维字符数组。
如果不使用sizeof来计算数组的大小,你需要的是数组所消耗的总字节数和数组元素类型的大小(以字节为单位)。一旦你有了这些信息,你就可以简单地用数组元素的大小除以总字节数。

#include <stdio.h>
#include <stddef.h>

int main (void) {
    int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    ptrdiff_t size = ((char *)(&a + 1) - (char *)&a) / ((char *)(a + 1) - (char *)a);

    printf("size = %td\n", size);
    return 0;
}

输出:

# ./a.out
size = 9

附加:
x一个m一个8 n一个x和x一个m一个9 n一个x是x一个e一个f一个x。

相关问题