C:指向可修改数组大小的常量数组指针
我有一个常量数组指针,其大小如下:C:指向可修改数组大小的常量数组指针,c,arrays,C,Arrays,我有一个常量数组指针,其大小如下: const UInt8* raw_addr = ujArrayRawAccessStart(addr); UInt8 addr_len = ujArrayLen(addr); UInt8 formatted_addr[sizeof(raw_addr)/sizeof(raw_addr[0]) + sizeof('\0')]; for(int i = 0; i< addr_len; i
const UInt8* raw_addr = ujArrayRawAccessStart(addr);
UInt8 addr_len = ujArrayLen(addr);
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
我需要在这个数组的末尾添加一些东西,'\0',因为实际上我们正在处理字符串和代码,这需要进一步的处理。
为此,我考虑初始化一个新数组,如下所示:
const UInt8* raw_addr = ujArrayRawAccessStart(addr);
UInt8 addr_len = ujArrayLen(addr);
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
UInt8格式化的地址[sizeof(raw\u addr)/sizeof(raw\u addr[0])+sizeof('\0');
对于(int i=0;i
但是,这会导致运行该节点的节点出现异常(其UART输出格式不正确),这表明我正在写不应该写的东西
我做错了什么,或者有更好的方法来实现我想要的吗?sizeof(raw\u addr)
是指针的大小!(UInt8*
)。不是(非正式地)它所指向的数组的大小。1
因此,您的格式化的\u addr
总是具有相同的大小,与原始\u addr
指向的内容的实际大小无关
sizeof(array)/sizeof(elem)
技巧仅适用于实际阵列。即类型[N]
如果addr\u len
不是太大,并且您的实现允许(请参阅),您可以声明一个:
否则,只有动态内存分配才能实现
1它只是一个指向内存块中第一个元素的指针,恰好包含几个连续的元素。从类型系统的角度来看不是数组。
sizeof(raw\u addr)
是指针的大小!(UInt8*
)。不是(非正式地)它所指向的数组的大小。1
因此,您的格式化的\u addr
总是具有相同的大小,与原始\u addr
指向的内容的实际大小无关
sizeof(array)/sizeof(elem)
技巧仅适用于实际阵列。即类型[N]
如果addr\u len
不是太大,并且您的实现允许(请参阅),您可以声明一个:
否则,只有动态内存分配才能实现
1它只是一个指向内存块中第一个元素的指针,恰好包含几个连续的元素。从类型系统的角度来看,不是数组。
UInt8格式化的\u addr[sizeof(raw\u addr)/sizeof(raw\u addr[0])+sizeof('\0')代码>-->UInt8格式化的地址[addr\u len+1]代码>顺便说一句:sizeof('\0')
=sizeof 0
在C语言中。你可能只需要1
@joopsizeof('\0')
是sizeof(int)
所以它可能是2
或4
而不是1
。这就是我写的。UInt8格式化的[sizeof(raw)addr)/sizeof(raw+0')代码>-->UInt8格式化的地址[addr\u len+1]代码>顺便说一句:sizeof('\0')
=sizeof 0
在C中。你可能只想1
@joopsizeof('\0')
是sizeof(int)
所以它可能是2
或4
而不是1
。这就是我写的。。。。但是对于数组的第一个元素。。。。但是到数组的第一个元素。