2017-01-12 6 views
0

У меня есть постоянный указатель массива и его размер, как это:C: Const указатель массива изменяемого размера массива

 const UInt8* raw_addr = ujArrayRawAccessStart(addr); 
     UInt8 addr_len = ujArrayLen(addr); 

И мне нужно добавить что-то к концу этого массива, то «\ 0», потому что на самом деле мы работаем со строками и кодом дальше по строке, это требует. Чтобы сделать это, я имел в виду инициализации нового массива, как это:

  UInt8 formatted_addr[sizeof(raw_addr)/sizeof(raw_addr[0]) + sizeof('\0')]; 
     for(int i = 0; i< addr_len; i++){ 
      formatted_addr[i] = raw_addr[i]; 
     } 
     formatted_addr[addr_len]='\0'; //string literal needs to end with \0 

Однако, это вызывает у меня узел, на котором узел работает, чтобы урод (его выход UART имеет неверный формат), указывая, что я где я не должен.

Что я делаю неправильно, или есть лучшие способы добиться того, чего я хочу?

+1

'UInt8 formatted_addr [sizeof (raw_addr)/sizeof (raw_addr [0]) + sizeof ('\ 0')];' -> 'UInt8 formatted_addr [addr_len + 1];' – LPs

+0

BTW: 'sizeof ('\ 0 ') '==' sizeof 0' в C. Вероятно, вы просто хотите '1' – joop

+0

@joop' sizeof (' \ 0 ') 'is' sizeof (int) ', и поэтому это, вероятно,' 2' или '4 'а не' 1'. – mch

ответ

3

sizeof(raw_addr) - размер указателя! (UInt8*). Не (неформально) размер массива, на который он указывает.

Так что ваши formatted_addr всегда будет иметь тот же размер, Вне зависимости от фактического размера, что указывает на raw_addr.

sizeof(array)/sizeof(elem) трюк работает только для реальных массивов. Т.е. Type[N]

Если addr_len не слишком большой, и ваши разрешения реализации (см __STDC_NO_VLA__ ), вы можете просто объявить variable-length array:

formatted_addr[addr_len + 1]; 

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


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

+1

raw_addr не указывает на массив. – 2501

+0

... но к 1-му элементу массива. – alk

Смежные вопросы