Jump to content
    

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).

 

Edited by jenya7

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

image.png.65a44b28426c6f315018cc41c90f0bc8.png

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

Edited by jenya7

Share this post


Link to post
Share on other sites

2 minutes ago, jenya7 said:

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

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

 

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

Share this post


Link to post
Share on other sites

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

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

 

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

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

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

Edited by jenya7

Share this post


Link to post
Share on other sites

Quote

The strlen() function calculates the length of the string pointed to by s, excluding the terminating null byte ('\0').

 

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

On 11/24/2022 at 1:30 PM, jenya7 said:
char body[src_len];

 

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

Share this post


Link to post
Share on other sites

On 11/24/2022 at 1:38 PM, dimka76 said:

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

в IAR да. если выставить галку allow VLA.

Share this post


Link to post
Share on other sites

2 minutes ago, jenya7 said:

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

 

15 minutes ago, jenya7 said:

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

 

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

strcpy(body, &src[3]);

 

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...