我正在用C语言编写嵌入式设备(STM32)的可执行文件。经过一些调试,我已将其缩减为此函数:
char * parse(char * start)
{
int i = 0;
char command[20];
print(start);
}
由于某种原因,当我调用此函数时,参数start
已损坏。现在,如果我注释掉command
初始化,我可以让它工作:
char * parse(char * start)
{
int i = 0;
// char command[20];
print(start);
}
在command
注释掉后,一切正常。我可能是因为RAM可能用完了。但这是程序很小,在检查堆栈指针寄存器后,我可以确认我还有很多RAM空间。
这里可能出现什么问题?破坏的编译器? (我正在使用一个名为Yagarto的ARM重新编译的GCC版本。)
答案 0 :(得分:2)
很可能你处于未定义行为的范围内,因为你在程序中的别处做错了。它在某些情况下工作的事实绝不会使未定义的行为可以接受: - )
可能,你已经覆盖了内存,或者你的字符串没有被终止,或者其他任何一个原因。
答案 1 :(得分:0)
你以某种方式破坏了parse
函数的堆栈。注释掉command
变量的声明将删除堆栈中20个字节的分配,如果你保留它就会隐式发生。
您可以在程序中尝试 Valgrind 以找出损坏发生的位置吗?
此外,print
功能是什么?尝试使用
start
的值
printf("%p\n", start);
您可以在内存中找到parse