C 指向现有数组而不是副本的指针

C 指向现有数组而不是副本的指针,c,arrays,pointers,C,Arrays,Pointers,我有一个数据包结构,它包含一些头信息和一个malloc'ed字节数组。当我想写出那个数据包时,我会malloc一个新的字节数组,插入头信息,然后memcpy structs payload字节数组到新的缓冲区中。我可以在不创建副本的情况下创建字节数组吗?这将生活在一个有2K内存的Arduino上,我想让每个字节都计数。我也在考虑保留原始字节数组的完整性,只做指向字节数组中与字段相关的值的指针 以下是我当前的代码: // .h typedef struct BLEPacket { uint

我有一个数据包结构,它包含一些头信息和一个malloc'ed字节数组。当我想写出那个数据包时,我会malloc一个新的字节数组,插入头信息,然后memcpy structs payload字节数组到新的缓冲区中。我可以在不创建副本的情况下创建字节数组吗?这将生活在一个有2K内存的Arduino上,我想让每个字节都计数。我也在考虑保留原始字节数组的完整性,只做指向字节数组中与字段相关的值的指针

以下是我当前的代码:

// .h
typedef struct BLEPacket {
    uint8_t  protocol;
    uint8_t  meta;
    uint16_t length;
    uint16_t checksum;
    const uint8_t* payload;
} BLEPacket;


//.c
uint8_t* bytesFromBLEPacket(BLEPacket packet){
    uint8_t *outBuffer = malloc(packet.length);
    outBuffer[0] = packet.protocol;
    outBuffer[1] = packet.meta;
    outBuffer[2] = highOrderByte(packet.length);
    outBuffer[3] = lowOrderByte(packet.length);
    outBuffer[4] = highOrderByte(packet.checksum);
    outBuffer[5] = lowOrderByte(packet.checksum);

    if (packet.payload != NULL){
        memcpy(outBuffer+PACKET_HEADER_SIZE, packet.payload, packet.length - PACKET_HEADER_SIZE);
    }
    return outBuffer;
}
编辑: 我没有很好的C语言背景,所以我不能完全确定是否/如何用这种方式直接访问内存。我可以执行类似于
byte[0]=packet.payload-packet\u HEADER\u SIZE
的操作吗

// ios client.m
-(void)sendMessage:(NSString*)message {
    NSData *data = [message dataUsingEncoding:NSASCIIStringEncoding];
    BLEPacket packet = BLEPacketCompose(MetaMessage, data.bytes, data.length);
    [self writePacket:packet];
}

-(void)writePacket:(BLEPacket)packet {
    uint8_t bytes[packet.length];
    bytesFromBLEPacket(packet,bytes); // updated with non-malloc version
    NSData *data = [NSData dataWithBytes:bytes length:packet.length];
    [self write:data]; // CoreBluetooth update characteristic value
}

// arduino.ino - a simple echo for now. I'm planning on including the same BLEPacket.h/.c file
void setup() {
    Serial.begin(115200); 
}

void loop() {
    if(Serial.available()) {
        Serial.write(Serial.read());  //echo, writes one byte at a time, in order
    }
}

我还需要数据包作为校验和的字节数组。我现在也想到,我可以对数据包头进行校验和/逐字节写入的硬编码,而不是对有效负载进行迭代。但是,为了学习,我怎样才能将一个结构的字段作为一个字节数组而不将它们放入另一个数组中?

首先,不要在小RESTS和BeReMeD嵌入式系统上使用C++从McLeC/C和NeX/ DELATE中删除。p> 其次,是的,您可以传入一个指向在函数外部静态定义的缓冲区的指针。它看起来像这样:

uint8_t bytesFromBLEPacket(BLEPacket packet, uint8_t* outBuffer, uint16_t outBufferSize) {

    // Do some basic sanity checking on the buffer size that was passed in
    if ( outBufferSize < 6 ) {
        // buffer is too small, return some error
        return 1;
    }

    if ( outBuffer == NULL ) {
        // buffer not allocated, return some error
        return 2;
    }

    outBuffer[0] = packet.protocol;
    outBuffer[1] = packet.meta;
    outBuffer[2] = highOrderByte(packet.length);
    outBuffer[3] = lowOrderByte(packet.length);
    outBuffer[4] = highOrderByte(packet.checksum);
    outBuffer[5] = lowOrderByte(packet.checksum);

    if (packet.payload != NULL){
        memcpy(outBuffer+PACKET_HEADER_SIZE, packet.payload, packet.length - PACKET_HEADER_SIZE);
    }

    return 0;
}

// You can call your new function like so:
#define BUFF_SIZE 10

uint8_t buffer[BUFF_SIZE] = {0};
uint16_t bufferSize = BUFF_SIZE;
int status = bytesFromBLEPacket( packet, buffer, bufferSize );
uint8字节来自BLEPacket(blepack-packet,uint8字节*exputffer,uint16字节exputfferize){
//对传入的缓冲区大小执行一些基本的健全性检查
如果(突出<6){
//缓冲区太小,返回一些错误
返回1;
}
if(exputffer==NULL){
//缓冲区未分配,返回一些错误
返回2;
}
exputffer[0]=packet.protocol;
exputffer[1]=packet.meta;
exputffer[2]=高阶字节(数据包长度);
exputffer[3]=lowOrderByte(数据包长度);
exputffer[4]=高位字节(数据包校验和);
exputffer[5]=lowOrderByte(数据包校验和);
if(packet.payload!=NULL){
memcpy(突发+包头大小,包有效载荷,包长度-包头大小);
}
返回0;
}
//您可以这样调用新函数:
#定义BUFF_大小10
uint8_t缓冲区[BUFF_SIZE]={0};
uint16\u t bufferSize=缓冲大小;
int status=bytesfromblepack(数据包、缓冲区、缓冲区大小);

memcpy
之后,你不能简单地释放
blepack
上的内存吗?那么在某个时候,我需要
2*sizeOf(blepack)
你到底想实现什么?如果只想返回字节,那么只返回字节,为什么要创建一个新的缓冲区并返回它呢?您可以检查它是否良好,然后只返回packet.payload本身或packet.payload+N,其中N是您的偏移量。无需复制,您只需获取数据包的地址,即
&数据包
。要获得更完整的答案,您需要在调用该函数后向我们展示如何使用
exputffer