Перейти к содержанию
    

IAR добавляет мусор в конце строки (?)

Я наверно где то туплю но

src_len = strlen(&src[3]);
char body[src_len];
memset(body, '\0', sizeof(body)); 
strncpy(body, &src[3], src_len);
    
int argc = 0;  

брейк пойнт на int argc = 0;

и что я вижу

image.png.588dd2d9c9977242c11929486068fbae.png

откуда в body мусор в конце строки?

не знаю насколько это важно но отладка в симуляторе (Debugger = Simulator).

 

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 24.11.2022 в 15:30, jenya7 сказал:

Я наверно где то туплю но

откуда в body мусор в конце строки?

strlen() возвращает длину строки без завершающего нуля.

Вот вы и создаете новую строку которая не завершается нулем.

И получаете мусор в конце, который обрывается по какому то случайному нулю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/24/2022 at 1:04 PM, Shamil said:

strlen() возвращает длину строки без завершающего нуля.

Вот вы и создаете новую строку которая не завершается нулем.

И получаете мусор в конце, который обрывается по какому то случайному нулю.

после memset строка проинициализирована. вот состояние после memset

image.png.65a44b28426c6f315018cc41c90f0bc8.png

а strlen - src не имеет никаких других чаров - это видно из окна отладки.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, jenya7 said:

после memset строка проинициализирована

А смысл в memset, если потом все будет перетерто strncpy?

 

Вы получили массив body с длиной 32 и без \0 в конце. Отображатор показывает больше 32.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/24/2022 at 1:22 PM, aaarrr said:

А смысл в memset, если потом все будет перетерто strncpy?

 

Вы получили массив body с длиной 32 и без \0 в конце. Отображатор показывает больше 32.

memset я добавил чтоб убрать мусор.

почему? так и есть 32 чара (без "for"). 

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/24/2022 at 1:34 PM, aaarrr said:

 

ок. меньше не больше. не вижу причину добавления мусора в конце.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, jenya7 said:

не вижу причину добавления мусора в конце

 

15 minutes ago, jenya7 said:

Вы получили массив body с длиной 32 и без \0 в конце. Отображатор показывает больше 32.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, jenya7 сказал:

ок. меньше не больше. не вижу причину добавления мусора в конце.

терминирующий ноль не  копирует, вам говорят.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смотрите. У Вас есть строка "abcdef". Вы берете через strlen() ее длину, получаете 6. После этого создаете массив длиной 6 байт, обнуляете его через memset() и копируете в него эту строку длиной 6 байт. Получаете массив длиной 6 байт, занятый шестью символами из скопированной строки. Все, седбмой байт, который должен быть нулем для завершения строки, остается за пределами массива, он не обнуляется в memset() и не копируется из оригинальной строки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, dimka76 сказал:

А что так можно ?

а почему бы и нет) память под  массив выделится на стэке.

static char body[src_len]; уже не прокатит

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, jenya7 сказал:

а всё потому что нефиг вымудриваться

Вы принципиально не читаете ответы? В вашем массиве должно быть зарезервировано место под признак окончания строки, байт с кодом 0. strcpy() не следит, что ваш массив уже закончился и тупо пишет все, что ей дали на вход. Вы испортили следующую за массивом переменную. Счастливой отладки!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...