假设我想打印int类型数组的值。
int *num = malloc(5 * sizeof(int));
我该怎么做?在我完成了所有的值之后,我显然想停下来,其中有5个值。
请注意,我不打算做以下事情:
for (int i=0;i<5;i++)
我想知道我给出的例子中发生的事情。
while(*num) {
printf("%d", *num);
num++;
}
OR
while(num != NULL) {
printf("%d", *num);
num++;
}
答案 0 :(得分:1)
C中的数组不具有长度。你必须将长度与数组一起传递。
最简单的方法是使用变量:
int i;
for (i = 0; i < 5; ++i)
printf("%d ", num[i]);
结尾NUL
的技巧通常仅用于字符串,字符串的结尾标有NUL
字符('\0'
)。当然,如果您自己构建和使用阵列,没有什么能阻止您制定类似的约定。例如,您可以使用-1
标记数组的结尾:
int *num = malloc(5 * sizeof(int));
num[4] = -1;
int *p;
for (p = num; *p != -1; ++p)
printf("%d ", *p);
答案 1 :(得分:1)
以您正在显示的方式使用已分配的数组时
int *num = malloc(5 * sizeof(int));
然后知道结束的唯一方法是使用用于分配数组的大小。像
int i = 0;
while(i < 5) // 5 here is the size used wile allocating
{
printf("%d", num[i]);
i++;
}
答案 2 :(得分:0)
您需要在某处存储数组的长度。其他一些策略是在数组末尾放置终结符或 sentinel 值(尽管该值对实际内容无效):
int *num = calloc(6, sizeof(int));
num[5] = -1;
int i;
for (i = 0; num[i] != -1; i++) {
//...
}
或者将数组的长度作为第一个元素嵌入:
int *num = malloc(6 * sizeof(int));
int len = num[0];
int i;
for (i = 1; i < len; i++) {
// ...
}
(注意,Flexible arrays是表达第二个例子的更好方式)
以上两个都展示了如何在数组本身中存储长度,并为此目的使用额外的元素。
答案 3 :(得分:-1)
while(*num) {
printf("%d", *num);
num++;
}
嗯,这一直持续到*num
为零。如果没有有效条目可以包含零并且您已将最后一个条目(或第一个无效条目)设置为零,则此方法正常工作。这称为哨兵值。
while(num != NULL) {
printf("%d", *num);
num++;
}
这不会奏效。增加num
不会使其成为NULL
。为什么会这样?
如果您想要输出特定数量的值,则有两个基本选择。您可以将要输出的值的数量传递给输出代码,并在输出该数量的值时计算。或者你可以使用&#34; sentinel&#34;标志结束的价值。如果零不是您想要打印的有效值,则可以使用零作为标记。不要忘记为哨兵分配空间。