return(sizeof(array))的返回值与预期不符。

5
我写了下面的程序来确定静态数组的大小。当我运行它时,得到了一个无法解释的结果。我在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;如果我将其更改为return sizeof(input[0][0]),则得到4,也是预期的结果。那么为什么sizeof(input)返回68,但存储后却得到了预期的324呢?

6
Shell 返回值可能最大为256… 324%256 = 68 - Shafik Yaghmour
你说得对,我没有考虑到shell的限制。这个问题在这里有答案:https://dev59.com/rGPVa4cB1Zd3GeqP6ope - David Wilkins
3个回答

7

你的系统退出码必须最大为255,我们可以看到324%256 = 68


这并不是由shell所施加的限制,尽管shell确实会报告返回值(如果您使用类似Bourne的shell,则为$?,如果您使用类似csh的shell,则为$status)。 - Keith Thompson
@KeithThompson 谢谢,我刚刚意识到了,我已经调整了我的答案。 - Shafik Yaghmour

4

当一个子进程终止时,其父进程可以通过以下方式获取该子进程的状态信息:

waitpid(-1, &status, 0);

使用WEXITSTATUS(status)可以从status中提取返回状态,根据waitpid(2)中所述的说明,该宏

返回子进程的退出状态。这包括子进程在调用exit(3)_exit(2)时指定的status参数的最低有效8位,或者在main()函数中的返回语句中作为参数指定的值。

因此,如果您的main()返回324,则从shell获取的返回代码将是324%256,即68。


@ShafikYaghmour 我认为Linux会意味着 & 255 - Lee Duhem

0

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

这就是为什么您的程序会给出这个输出,因为324是数组的大小,但shell只能显示256个。

324%256=68;

如果你想输出更多内容,可以将其写入标准输出或文件中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接