【问题标题】:Full array not being passed in C未在 C 中传递完整数组
【发布时间】:2012-07-05 09:13:45
【问题描述】:

我正在处理插入排序,而我在 main() 中的数组似乎只是部分传递给了 sort()。下面的 sn-p 显示 main() 中的 test 具有值 {2, 1, 3, 1, 2},但 sort() 中的 arr 具有值 {2, 1}。这是怎么回事?

 #include <stdio.h>

 int sort(int* arr) {
      int i = 0;
      int j, key;
      int count = 0;

      printf("Inside sort(): ");
      for (j = 0; j < sizeof(arr)/sizeof(int); ++j)
           printf("%d ", arr[j]);
      printf("\n");

      for (j = 1; i < sizeof(arr)/sizeof(int); ++j) {
           key = arr[j];
           i = j - 1;
           while (i >= 0 && arr[i] > key) {
                arr[i + 1] = arr[i];
                --i;
                ++count;
           }
           arr[i + 1] = key;
      }
      return count;
 }

 int main(int argc, char* argv) {
      int test[] = {2, 1, 3, 1, 2};
      int i = 0;
      printf("Inside main(): ");
      for (i = 0; i < sizeof(test)/sizeof(int); ++i)
           printf("%d ", test[i]);
      printf("\n");
      int count = sort(test);
 }

【问题讨论】:

  • 从中吸取的教训是将数组的大小传递给您正在调用的函数。不要试图让函数确定数组的大小。通常,该函数无法确定大小。在一些选定的特殊情况下,这是可能的(例如,指针数组的末尾有一个空指针)。 main() 的参数列表是 int main(int argc, char **argv) 并非偶然,尽管这是可以使用空指针来确定参数列表结尾的特殊情况之一。

标签: c algorithm insertion-sort


【解决方案1】:

成语sizeof(arr)/sizeof(int) 仅适用于静态分配的数组,并且仅在定义它们的范围内。

换句话说,您可以将它用于如下数组:

int foo[32];

...在定义它们的范围内。但不是其他地方,也不是简单地作为指针传递的数组。对于其他情况,您需要传递指示数组中预期元素数量的额外信息。

【讨论】:

  • 类似int sort(int* arr, int size)?
  • 完全正确。或者更好的是size_t size
  • @BrewerHimself 是的,这样就可以了 :) 请明确 size 是数组的大小(以字节为单位)还是包含元素的数量。
  • @BrewerHimself 元素数量很好。我只是为了避免代码中的潜在混淆...
  • 1) 它没有签名。 2)它足够大,可以表达任何大小(在内存中)顺便说一句:size = sizeof test /sizeof test[0] 更干净,因为它不依赖于测试的实际类型[0](如果您将测试类型更改为双精度或结构 xyz)
猜你喜欢
  • 1970-01-01
  • 2020-06-21
  • 1970-01-01
  • 2010-12-24
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
  • 1970-01-01
相关资源
最近更新 更多