我想知道以下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
答案 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 它。)