当前位置: 首页 > 知识库问答 >
问题:

gcc优化标志中断代码

章威
2023-03-14
#include <cstdio>
int main(){
  float *ptr = ({float var[10] = {1,2,3,4,5,6,7,8,9,10}; var;});
  float *ptr1 = ({float var[10]; for(int i_=0;i_<10;i_++)var[i_]=i_+1; var;});
  float *ptr2 = ({float var[10]; var[4]=5; var;});
  printf("\n value = %f %f %f",ptr[4],ptr1[4],ptr2[4]);
}

PTR1存在与循环有关的问题。为什么?也许是虫子?

我使用的是最新的4.8.0,经过测试的x64、x86以及其他版本。都是同样的行为。

共有1个答案

富辰阳
2023-03-14

您使用的是GNU语言扩展,因此让我们看看GNU文档:

在语句表达式中,语句中创建的任何临时时间都将在该语句的末尾销毁。

var每次都会被销毁,并且指向其第一个元素(表达式返回的元素)的指针取消引用是不安全的。

 类似资料:
  • 我正在使用GCC4.4.2构建一些大型项目。因为我想构建它以供发布,所以我使用了GCC优化标志,但不幸的是,它在某种程度上弄乱了我的代码,最终的二进制文件没有按照预期工作,当使用标志(或没有优化)构建时,一切都很好。我之前的项目也有类似的问题,当时是标志在优化级别上造成了问题,我通过搜索本文档中提到的所有标志,就优化级别而言,设法发现它是由该特定标志引起的: http://gcc.gnu.org/

  • 问题内容: 我最近一直在用C编写很多代码,现在正在切换到Java。我当前正在实现一个大型数据结构,并且想知道在调用Java编译器时是否可以打开任何优化标志,以提高gcc之类的性能。 我习惯于: 有类似的命令javac吗? 我正在使用JDK并正在运行Ubuntu 10.04。 问题答案: Java中的优化主要由JIT编译器在运行时完成。因此,没有必要试图指示它在编译时优化某种方式(无论如何它仅创建字

  • 我编译了以下C代码: 使用命令 .下面是输出中的 Bar 函数: 我有几个关于这个汇编代码的问题: > 如果函数体中既没有使用也没有使用rsp,那么"",""和""的目的是什么? 为什么和自动包含C函数的参数(分别为和)而不从堆栈中读取它们? 我尝试将Foo的大小增加到88字节(11s),指令变成了。将我的结构设计为“圆形”大小以避免乘法指令(以优化数组访问)是否有意义?指令被替换为:

  • 我正在使用GCC为ARM开发一个C。我遇到了一个问题,我没有启用优化,我无法为我的代码创建二进制(ELF),因为它不适合可用空间。然而,如果我只是启用调试优化(-Og),这是我所知的最低优化,代码很容易适合。 在这两种情况下,都启用了-ffunction-节、-fdata-节、-fno-异常和-Wl、--gc-节。 闪存大小:512 kB 没有优化:. text溢出约200 kB 使用-Og优化:

  • 我有一个项目,我尝试为微控制器构建固件,并尝试更好地控制使用的优化标志。我想要,而不是使用

  • 我试图找出关键的优化选项。首先,用 -Q-v列出了启用的标志(-faggressive loop optimizations-falign labels-fasynchronous unwind tables等)。然后,如果将这些标志直接提供给gcc而不是-O3,那么如果禁用了优化,则生成的程序的性能将降低。 gcc文件指出 并不是所有的优化都由一个标志直接控制 会是这个问题还是我错过了其他的?