Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
堆栈中变量的顺序(GCC)_C_Variables_Gcc_Stack - Fatal编程技术网

堆栈中变量的顺序(GCC)

堆栈中变量的顺序(GCC),c,variables,gcc,stack,C,Variables,Gcc,Stack,在GCC中编译C代码时,有没有办法保证堆栈变量将按照我声明的顺序出现在堆栈中(或者按照相反的顺序出现,对我来说无关紧要)?我知道这是可以通过结构实现的,但我不想使用它们。唯一的方法是结构,它按照您喜欢的顺序包含所有变量 对于局部变量,编译器可以按照任何适合的顺序重新排序/重用变量。一些变量可能根本没有内存位置,它们只存在于寄存器中,其他变量将被完全优化。唯一的方法是按您喜欢的顺序包含所有变量的结构 对于局部变量,编译器可以按照任何适合的顺序重新排序/重用变量。一些变量可能根本没有内存位置,它们只

在GCC中编译C代码时,有没有办法保证堆栈变量将按照我声明的顺序出现在堆栈中(或者按照相反的顺序出现,对我来说无关紧要)?我知道这是可以通过结构实现的,但我不想使用它们。

唯一的方法是结构,它按照您喜欢的顺序包含所有变量


对于局部变量,编译器可以按照任何适合的顺序重新排序/重用变量。一些变量可能根本没有内存位置,它们只存在于寄存器中,其他变量将被完全优化。

唯一的方法是按您喜欢的顺序包含所有变量的结构


对于局部变量,编译器可以按照任何适合的顺序重新排序/重用变量。一些变量可能根本没有内存位置,它们只存在于寄存器中,其他变量将被完全优化。

如果您坚持不想使用结构,那么您必须使用
alloca()
自行分配堆栈内存。但是,您需要在堆栈内存块中手动管理本地变量


我不建议你这样做。使用结构。

如果您坚持不想使用结构,则必须使用
alloca()
自行分配堆栈内存。但是,您需要在堆栈内存块中手动管理本地变量


我不建议你这样做。使用结构。

最可靠的方法是指导gcc使用
gcc-S
生成汇编语言输出,并检查汇编语言输出以找出哪些变量放在哪里。如果编译时没有进行优化,那么变量可能不会被删除或重新排列,如果为每个局部变量指定不同的值,那么应该很容易发现每个局部变量


我承认这不是很高科技。但是如果你想确定gcc生成的代码是以一种特定的方式工作的,你必须查看它生成的代码…

最可靠的方法是使用
gcc-S
引导gcc生成汇编语言输出,并检查汇编语言输出,找出哪些变量放在了哪里。如果编译时没有进行优化,那么变量可能不会被删除或重新排列,如果为每个局部变量指定不同的值,那么应该很容易发现每个局部变量


我承认这不是很高科技。但是如果你想确定gcc生成的代码是以一种特定的方式工作的,你必须看看它生成的代码…

你为什么要这样做?而
结构有什么问题呢
?我想演示一个特定的堆栈溢出问题,当缓冲区和指针以某种方式放置时。我不想使用结构(更确切地说,我不能),因为一些变量是在内联函数中声明的,这些内联函数后来从主例程中调用。另外,我看了“C编译器可以重新排列堆栈变量吗?”基本上整个线程都像“是的,这可能发生,除非使用结构”正如我所说的,这是我不想做的事情。在这方面没有任何变化。与此同时,你甚至不能保证你的变量存储在堆栈上——编译器可能会将它们完全保存在寄存器中。或者,它可以在堆栈插槽中存储两个变量。这完全取决于编译器。你为什么想要这个?而
结构有什么问题呢
?我想演示一个特定的堆栈溢出问题,当缓冲区和指针以某种方式放置时。我不想使用结构(更确切地说,我不能),因为一些变量是在内联函数中声明的,这些内联函数后来从主例程中调用。另外,我看了“C编译器可以重新排列堆栈变量吗?”基本上整个线程都像“是的,这可能发生,除非使用结构”正如我所说的,这是我不想做的事情。在这方面没有任何变化。与此同时,你甚至不能保证你的变量存储在堆栈上——编译器可能会将它们完全保存在寄存器中。或者,它可以在堆栈插槽中存储两个变量。这完全取决于编译器。”…因为它适合她。”所以你的编译器是女性。有趣:)@adelphus:他们还用英语制造女性船只,这对他们来说同样奇怪bystanders@adelphus当前位置我想我恋爱了。。。用我的编译器“…因为它适合她。”所以你的编译器是女性。有趣:)@adelphus:他们还用英语制造女性船只,这对他们来说同样奇怪bystanders@adelphus当前位置我想我恋爱了。。。用我的编译器。