2014-09-29 2 views
0

Я пытаюсь передать строку в функцию из c и по какой-то причине, хотя я не задал значение для переменной, но она уже обладает значением другой переменной и если я ее изменяю , изменения, похоже, переписывают другую переменную. Вот код:Arduino Char Array Mapping Overlap

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. Вот результат, если я введу face как моя строка:

face 
face 
3e 
2c 
1c 
0e 
0e 
1c 
2c 
3e 
ecce 

Почему отображать строки в той же ячейке памяти?

ответ

1

Одна из основных проблем в вашем коде заключается в том, как вы создаете массивы s в readstring() и rev в str_reverse(). Оба экземпляра создаются в стеке вызываемой функции (соответствующие функции) и будут освобождены по возвращении. Автоматическое «освобождение» (конец срока службы, по спецификации языка) позволит новому функционировать для повторного использования одной и той же памяти для своего стека. Это дало вам иллюзию перекрытия.

Для тестирования, чтобы увидеть другие проблемы в коде, используйте эти массивы как static или глобальные.

+0

Хорошо, что объясняет перекрытие чтения, но r возвращается к основной функции (и сохраняется), а затем используется параметр в str_reverse, поэтому почему он изменяется при изменении обратного? – cujo

+0

Хотя решение s global решило мою проблему, так что спасибо за решение. – cujo

+0

Мы можем потратить время на то, почему произошло что-то подобное, но на самом деле это не очень полезно, когда это связано с неправильным использованием/непониманием языка. После того, как вы вернетесь из функции, вы не можете получить доступ к автоматическим переменным, которые были объявлены в функции (т. Е. Помещены в стек). –