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
@joop
sizeof('\0')
sizeof(int)
所以它可能是
2
4
而不是
1
。这就是我写的。
UInt8格式化的[sizeof(raw)addr)/sizeof(raw+0')-->
UInt8格式化的地址[addr\u len+1]顺便说一句:
sizeof('\0')
=
sizeof 0
在C中。你可能只想
1
@joop
sizeof('\0')
sizeof(int)
所以它可能是
2
4
而不是
1
。这就是我写的。。。。但是对于数组的第一个元素。。。。但是到数组的第一个元素。