我有一个常量数组指针,其大小如下:
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输出格式不正确),表明我正在写一个我不应该写的地方。
我做错了什么,或者有更好的方法来实现我想要的目标?
答案 0 :(得分:3)
sizeof(raw_addr)
是指针的大小! (UInt8*
)。不(非正式地)它指向的数组的大小。 1
因此formatted_addr
总是具有相同的大小,无论raw_addr
指向的实际大小如何。
sizeof(array)/sizeof(elem)
技巧仅适用于实际数组。 I.e Type[N]
如果addr_len
不是太大且您的实施允许(请参阅__STDC_NO_VLA__
),您只需声明variable-length array:
formatted_addr[addr_len + 1];
否则,只有动态内存分配才能完成。
1 它只是一个指向内存块中第一个元素的指针,该元素恰好包含多个连续元素。从类型系统的角度来看,它不是一个数组。