Этот ваш лживый С или "ты проверяй какого пола твой сосед"

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Собственно это 1-я часть пятничного поста:
Есть такой маленький пример:
 

// ESP8266
char tic[8];
uint32_t n = 0xfefefefe;

void setup() {
Serial.begin(115200);
}

void loop() {
Serial.println(n);
delay(1000);
Serial.println(utoa(n,tic,10));
delay(1000);
}

Под переменную отведён заведомо меньший объём памяти! И что же видим...полёт нормальный...
 

4278124286
4278124286

 

sadman41
Offline
Зарегистрирован: 19.10.2016

А ожидалось, что чип треснет напополам?

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

sadman41 пишет:
А ожидалось, что чип треснет напополам?

Ожидалось, что отсечёт на уровне 7 знаков

sadman41
Offline
Зарегистрирован: 19.10.2016

Каким образом функция узнает по указателю размер выделенной области памяти? Что-то я не припомню таких методов против Кости Сапрыкина.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

sadman41 пишет:
Каким образом функция узнает по указателю размер выделенной области памяти? Что-то я не припомню таких методов против Кости Сапрыкина.

Смотрим дальше:
 

// ESP8266
char tic[8];
char tic1[11];
uint32_t n = 0xfefefefe;

void setup() {
Serial.begin(115200);
}

void loop() {
Serial.println(n);
delay(1000);
Serial.println(utoa(n,tic1,10));
Serial.println(utoa(n,tic,10));
delay(1000);
Serial.print("tic=");
Serial.println(tic);
Serial.print("tic1=");
Serial.println(tic1);
}

И вывод:
 

4278124286
4278124286
tic=4278124286
tic1=4278124286

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Посмотрел. Вопрос тот же, что и выше.

nik182
Онлайн
Зарегистрирован: 04.05.2015

Ну просто повезло.

Logik
Offline
Зарегистрирован: 05.08.2014

Как вы стали валютной  проституткой? 

- ну просто повезло!

 

Тему переименовать в "пример выхода за границы массива."

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ничо не понял, ну ладно, понаблюдаю.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016
// Atmega328
char tic[8];
char tic1[11];
uint32_t n = 0xfefefefe;

void setup() {
Serial.begin(115200);
}

void loop() {
Serial.println(n);
delay(1000);
Serial.println(ultoa(n,tic1,10));
Serial.println(ultoa(n,tic,10));
delay(1000);
Serial.print("tic=");
Serial.println(tic);
Serial.print("tic1=");
Serial.println(tic1);
}

В мониторе порта:
 

4278124286
4278124286
4278124286
tic=4278124286
tic1=86

Здесь то всё логично!

sadman41
Offline
Зарегистрирован: 19.10.2016

Логично что - два знака вместо семи? Обождите, я через часик накачу и вернусь - может действительно все логично.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

sadman41 пишет:
Логично что - два знака вместо семи? Обождите, я через часик накачу и вернусь - может действительно все логично.

вместо 11 )))
Жду, ты потом поделись какие "Леночка, яица подействовали"

Komandir
Offline
Зарегистрирован: 18.08.2018

Компилятор переменные в памяти расставляет как ему удобно ...

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Komandir пишет:

Компилятор переменные в памяти расставляет как ему удобно ...

я думаю дело не в этом, еще в Турбо С первой версии было выравнивание на величину сегмента (32 байта), может оно? Так вот куда утекать может всё, нажитое непосильным трудом )))

Komandir
Offline
Зарегистрирован: 18.08.2018

Адреса выведи

b707
Offline
Зарегистрирован: 26.05.2017

Какая тут пятница? - тупая какая-то тема, троллинг скучный и несмешной, особенно после аналогичного обсуждения запихивания строки в указатель в соседней теме.

Ребята, какой смысл обсуждать результаты НЕПРАВИЛЬНОГО использования памяти? - ТС лучше бы чему правильному поучился

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Komandir пишет:

Адреса выведи

Это оно?
 

.bss.tic1      0x3ffee2a8        0xb C:\temp\arduino_build_84883\sketch\sketch_dec17a.ino.cpp.o
                0x3ffee2a8                tic1
 .bss.tic       0x3ffee2b3        0x8 C:\temp\arduino_build_84883\sketch\sketch_dec17a.ino.cpp.o
                0x3ffee2b3                tic

 

Выходит не лживый однако, эффективный манипулятор сознанием )))

Komandir
Offline
Зарегистрирован: 18.08.2018

Теперь поменяйте порядок объявления переменных и одно налезет на другое как в AVR.

Просто вам повезло и tic наехал на что то другое ...

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Komandir пишет:

Теперь поменяйте порядок объявления переменных и одно налезет на другое как в AVR.

Просто вам повезло и tic наехал на что то другое ...

так и случилось

Komandir
Offline
Зарегистрирован: 18.08.2018

Адрес можно и без листинга увидеть - Serial.println((uint32_t)&n, HEX);

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

Какая тут пятница? - тупая какая-то тема, троллинг скучный и несмешной, особенно после аналогичного обсуждения запихивания строки в указатель в соседней теме.

Не хочу расстраивать, но троллингом тут не пахнет. Все на полном серьёзе. 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

на самом деле и темы бы не было если бы вчера не напоролся на невоспроизводимый сегодня глюк, а именно, в переменную tic записывалось что угодно, но только не значение переменной n, пока поле переменной tic не расширил до 14 байт.

Не 11 а 14 Карл...