我正在尝试使用GDB调试以下C程序:
// Program to generate a user specified number of
// fibonacci numbers using variable length arrays
// Chapter 7 Program 8 2013-07-14
#include <stdio.h>
int main(void)
{
int i, numFibs;
printf("How many fibonacci numbers do you want (between 1 and 75)?\n");
scanf("%i", &numFibs);
if (numFibs < 1 || numFibs > 75)
{
printf("Between 1 and 75 remember?\n");
return 1;
}
unsigned long long int fibonacci[numFibs];
fibonacci[0] = 0; // by definition
fibonacci[1] = 1; // by definition
for(i = 2; i < numFibs; i++)
fibonacci[i] = fibonacci[i-2] + fibonacci[i-1];
for(i = 0; i < numFibs; i++)
printf("%llu ", fibonacci[i]);
printf("\n");
return 0;
}
我遇到的问题是在尝试使用以下命令编译代码时:
clang -ggdb3 -O0 -Wall -Werror 7_8_FibonacciVarLengthArrays.c
当我试图对创建的a.out文件运行gdb并逐步执行程序时,无论何时在fibonacci[]数组声明后键入"info locals",结果会显示>(直到我的for循环的第一次迭代之后),这导致fibonacci在程序的其余部分保持地址0xbffff128(但解引用该地址并不包含任何有意义的数据)。我只是困惑为什么clang似乎在使用-O0标志时优化了这个数组?
我可以使用gcc编译此代码,并在使用GDB时正常显示值。您有什么想法吗?
谢谢。
-O0
并不意味着“关闭所有优化”。嗯,它确实是这样,但clang
似乎并不在意。有些优化是无法关闭的,例如1 + 2
将始终被常量折叠,无论如何。显然,这就是其中之一。 - user529758