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或全局数组。

+0

好吧,解释读取重叠,但r返回到主函数(和存储),然后在str_reverse中使用一个参数,所以当我修改反向时它被修改? – cujo 2014-09-29 03:49:51

+0

尽管让全球化解决了我的问题,但非常感谢您的解决方案。 – cujo 2014-09-29 03:53:44

+0

我们可以花时间为什么发生这样的事情,但是当它是误用/误解语言的结果时,它确实不是非常有用。一旦从函数返回,您不能授予在函数中声明的自动变量(即放置在其堆栈中)可能发生的情况。 – 2014-09-29 04:32:50