我是一个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);
}
3条答案
按热度按时间o4hqfura1#
不,通常情况下,数组没有默认的标记字符。
作为一种特殊情况,以空终止符(ASCII值0)结尾的数组被称为字符串。然而,这是一种特殊情况,而不是标准情况。
ubof19bj2#
在C编程中,数组通常不以空值结尾。数组是一个连续的内存块,包含固定数量的相同类型的元素。数组的大小在创建时确定,不能更改。
若要访问数组的元素,可以使用索引。数组的第一个元素位于索引0处,第二个元素位于索引1处,依此类推。数组的大小不与数组一起存储,因此必须自己跟踪它或使用单独的变量来存储它。
如果要表示大小可变且以特殊值结尾的元素列表,可以改用链接列表或以空值结尾的字符串。以空值结尾的字符串是以空字符('\0')结尾的字符序列
weylhg0b3#
用这个数组试试你的代码
你会发现输出是
size=2
,为什么?因为for循环条件-
a[i] != '\0'
。那么,当
for
循环条件达到-a[i] != '\0'
时会发生什么呢?此
'\0'
为整型字符常量,类型为int
,与0
相同,当a[i]
为0
时,条件变为false
,退出循环。在您的程序中,数组
a
的元素都没有值0
,for
循环继续迭代,因为条件导致数组的每个元素都为true
,您的程序最终访问的数组超出了其大小,这会导致未定义的行为。在
C
中,数组和字符串都不以NULL
结尾,相反,字符串实际上是以第一个空字符'\0'
结尾并包含该空字符的一维字符数组。如果不使用
sizeof
来计算数组的大小,你需要的是数组所消耗的总字节数和数组元素类型的大小(以字节为单位)。一旦你有了这些信息,你就可以简单地用数组元素的大小除以总字节数。输出:
附加:
x一个m一个8 n一个x和x一个m一个9 n一个x是x一个e一个f一个x。