return(sizeof(array))给出了意想不到的结果

时间:2014-02-28 18:31:00

标签: c arrays return-value sizeof

我编写了以下程序来确定静态数组的大小。当我跑它时,我得到了一个我无法解释的结果。我已经在stackexchange和google上做了一些搜索,但我读过的内容并没有给我一些提示。

#include <stdio.h>
int main()
{
  int arrSize, intSize, elemSize;
  int input[9][9];
  arrSize = sizeof(input);
  intSize = sizeof(int);
  elemSize = sizeof(input[0]);
  printf("Array: %d, Element: %d, Int: %d\n", arrSize, elemSize, intSize);
  return sizeof(input);
}

当我编译并运行该程序时,我得到以下结果(使用linux):

./a.out ; echo $?
Array: 324, Element: 36, Int: 4
68

我从http://c-faq.com/malloc/sizeof.html看到sizeof是在编译时计算的,如果我将返回值更改为return sizeof(input[0]),我会得到36这是预期的,我得到{ {1}}如果我按预期将其更改为4。那么为什么return sizeof(input[0][0])会在回复中提供sizeof(input),但是在存储时会给出预期的68

3 个答案:

答案 0 :(得分:7)

您系统的exit code必须为255,我们可以看到324 % 256 = 68

答案 1 :(得分:4)

子进程终止后,其父进程可以通过

获取该子进程的状态信息
waitpid(-1, &status, 0);

根据waitpid(2)此宏

,可以从status WEXITSTATUS(status)提取返回状态

  

返回子项的退出状态。这包括子项在exit(3)_exit(2)的调用中指定的状态参数的最不重要的8位,或者作为{{1中的return语句的参数}}

因此,如果您的main()返回324,则您从shell获得的返回代码为main(),即68。

答案 2 :(得分:0)

从bash shell和脚本语言参考文档的“退出状态”部分:[2] 执行命令的退出状态是waitpid系统调用或等效函数返回的值。但退出状态介于0到255之间,如下所述,shell可能会特别使用大于125的值。 shell builtins和复合命令的退出状态也仅限于此范围。在某些情况下,shell将使用特殊值来指示特定的故障模式。 有关更多信息,请访问:Exit status in Unix

这就是为什么你的程序提供这个输出,因为324是数组的大小,但shell只能显示256个所以

324%256=68;

如果要输出更多,可以将其写入stdout或文件。