我有:
int arraySize(int arr[]) {
int size = 0;
for(int i=0;i>-1;) {
Serial.println(arr[i]);
if(arr[i] != NULL) {
size++;
i++;
}
else {
break;
}
}
return size;
}
void loop() {
int stuff[2] = {5, 6};
arraySize(stuff);
delay(2000);
}
应该只打印2个项目(5和6),但我得到5,6,13312,23296。
出了什么问题?
答案 0 :(得分:4)
忽略整数溢出时遇到的未定义行为的可能性,并假设数组中没有0
会破坏循环,for (int i = 0; i >-1;)
将无限循环,因为你只增加{{ 1}}。
唉,你不能诉诸巧妙的技巧来获得传递给函数的数组的长度。读取数组越界索引的行为是 undefined 。
处理此问题的常规方法是跟踪数组的大小(作为i
类型)并将其传递给需要数组的函数。另一种方法是使用幻数来表示数组的结尾,而不是像C风格字符串的size_t
终结符。
答案 1 :(得分:1)
问题出在for(int i=0;i>-1;)
和i++;
部分,这意味着条件始终为真。
答案 2 :(得分:1)
您的代码需要一个以NULL结尾的数组,但您的数组不是。我会试试
$ cat dummy.c
#include <stdlib.h>
#include <stdio.h>
size_t arraySize(const int *arr) {
const int *p = arr;
while (1) {
if (*p == 0)
break;
// commented out for testing the code..
//Serial.println(*p);
printf("%d\n", *p);
p++;
}
return p - arr;
}
int main(__attribute__((unused)) int argc, __attribute__((unused)) char **argv)
{
int stuff[3] = {5, 6, 0};
printf("size: %ld\n", arraySize(stuff));
return(0);
}
$ gcc -Wall -Wextra -Werror -o dummy dummy.c
$ ./dummy
5
6
size: 2
我已经评论了Serial.println()
部分,因为我猜你的系统上有一些API(Arduino?)。
答案 3 :(得分:0)
在循环中,您在打印array [i]之前检查它是否为空。 这只能解释第一个奇怪的数字。不确定第二个数字。