C:Const数组指向可修改数组大小的指针

时间:2017-01-12 09:30:34

标签: c arrays

我有一个常量数组指针,其大小如下:

        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 个答案:

答案 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 它只是一个指向内存块中第一个元素的指针,该元素恰好包含多个连续元素。从类型系统的角度来看,它不是一个数组。