数组包含的内容应超过

时间:2018-02-09 19:46:58

标签: c++ arrays arduino

我有:

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。

出了什么问题?

4 个答案:

答案 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]之前检查它是否为空。 这只能解释第一个奇怪的数字。不确定第二个数字。