2014-09-29 77 views
0

我想傳遞一個字符串到一個函數在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 

爲什麼它映射的字符串相同的內存插槽?

回答

1

代碼中的一個主要問題是如何在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