Arduino字符阵列映射重叠
问题描述:
我想传递一个字符串到一个函数在c和由于某种原因,即使我没有为变量设置一个值,但它已经拥有其他变量的值,如果我改变它,这些更改似乎会覆盖其他变量。下面是代码:Arduino字符阵列映射重叠
void reverse(char *s, char *reverse)
{
uint32_t length = str_length(s);
Serial.println(reverse);
Serial.println(s);
for (uint32_t i = 0; i < length; i++)
{
Serial.print(length - i - 1);
Serial.println(s[length - i - 1]);
reverse[i] = s[length - i - 1];
}
for (uint32_t i = 0; i < length; i++)
{
Serial.print(i);
Serial.println(s[i]);
}
reverse[length] = '\0';
Serial.println(reverse);
}
char* readstring()
{
char s[128];
readline(s, 128);
return s;
}
char* str_reverse(char *r)
{
char rev[128];
reverse(r, rev);
return rev;
}
readstring()
早在代码中调用并成为str_reverse
参数r。下面是输出,如果我进入face
我的字符串:
face
face
3e
2c
1c
0e
0e
1c
2c
3e
ecce
为什么它映射的字符串相同的内存插槽?
答
代码中的一个主要问题是如何在str_reverse()
中创建readstring()
和rev
中的阵列s
。这两个实例都是在被调用函数的堆栈中创建的(它们各自的功能),并且在返回时将被释放。自由的'释放'(语言规范结束时间)将允许新的功能为其堆栈重用相同的内存。这给了你重叠的错觉。
要进行测试,要查看代码中的其他问题,请将这些数组用作static
或全局数组。
好吧,解释读取重叠,但r返回到主函数(和存储),然后在str_reverse中使用一个参数,所以当我修改反向时它被修改? – cujo 2014-09-29 03:49:51
尽管让全球化解决了我的问题,但非常感谢您的解决方案。 – cujo 2014-09-29 03:53:44
我们可以花时间为什么发生这样的事情,但是当它是误用/误解语言的结果时,它确实不是非常有用。一旦从函数返回,您不能授予在函数中声明的自动变量(即放置在其堆栈中)可能发生的情况。 – 2014-09-29 04:32:50