传递给函数的参数已损坏

时间:2012-03-29 13:23:52

标签: c embedded

我正在用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版本。)

2 个答案:

答案 0 :(得分:2)

很可能你处于未定义行为的范围内,因为你在程序中的别处做错了。它在某些情况下工作的事实绝不会使未定义的行为可以接受: - )

可能,你已经覆盖了内存,或者你的字符串没有被终止,或者其他任何一个原因。

答案 1 :(得分:0)

你以某种方式破坏了parse函数的堆栈。注释掉command变量的声明将删除堆栈中20个字节的分配,如果你保留它就会隐式发生。

您可以在程序中尝试 Valgrind 以找出损坏发生的位置吗?

此外,print功能是什么?尝试使用

在两种情况下打印start的值
printf("%p\n", start);

您可以在内存中找到parse

指向的地址的函数堆栈