通过使用指向第一个参数的指针迭代函数的参数

时间:2016-07-25 10:07:39

标签: c pointers parameter-passing c99 c11

我想知道以下C代码是否符合C99和/或C11标准:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="http://cdnjs.cloudflare.com/ajax/libs/chosen/1.1.0/chosen.min.css" rel="stylesheet"/>
<script src="http://cdnjs.cloudflare.com/ajax/libs/chosen/1.1.0/chosen.jquery.min.js"></script>
<link href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet"/>


<select class="form-control chosen" data-placeholder="Choose an option please">					    
  <option value=""></option>
  <option value="1" >Option 1</option>
  <option value="2" >Option 2</option>
</select>

此代码段在使用visual studio 2013并打印时按预期编译和运行:

  

0:8
  1:32
  2:4

3 个答案:

答案 0 :(得分:11)

不,不在附近。

C标准不保证函数参数存储在连续的内存位置(或任何特定的排序,就此而言)。由编译器和/或平台(体系结构)决定如何将函数参数传递给函数。

为了进一步增加清晰度,甚至不能保证要传递的参数存储在存储器(例如,堆栈)中。对于某些所有参数,他们也可以使用硬件寄存器(适用时),以便快速进行操作。例如,

  • 的PowerPC

      

    PowerPC体系结构具有大量寄存器,因此大多数函数可以将寄存器中的所有参数传递给单级调用。 [...]

  • MIPS

      

    最常用的32位MIPS调用约定是O32 ABI,它将前四个参数传递给寄存器$a0中的函数 - $a3;后续参数在堆栈上传递。 [...]

  • X86

      

    x86体系结构与许多不同的调用约定一起使用。由于架构寄存器数量较少,x86调用约定通常在堆栈上传递参数,而返回值(或指向它的指针)在寄存器中传递。

等等。查看full wiki article here

因此,在您的情况下,bars[0]有效访问权限,但bars[1]bars[2]是否有效,取决于基础环境(平台/编译器),完全。最好不要依赖你期待的行为。

那就是说,如果你不打算使用传递给main()的参数(,如果有的话),你可以简单地将签名减少到int main(void) {。 {1}}。

答案 1 :(得分:7)

不,它不遵守任何已发布的标准。如何存储参数和局部变量,以及编译器的位置。在一个编译器中可能起作用的可能在另一个编译器中不起作用,或者甚至在同一编译器的不同版本上起作用。

C规范甚至没有提到堆栈,它指定的只是范围规则。

答案 2 :(得分:5)

没有标准支持这一点。这非常顽皮。

数组索引和指针算法仅对数组有效。 (注意一个小例外:你可以读取指针一个数组或一个标量,但你不能 deference 它。)