【发布时间】:2013-04-14 03:35:32
【问题描述】:
我正在尝试编写一个字符串(完全是 char 数组),其中包含固定的 14 个起始字符并以不同的内容结尾。可变位包含 2 个浮点数和 1 个 32 位整数,它们在数组中被单独视为 4 个 1 字节字符,以逗号分隔。它可以通过以下代码来说明,由于某些明显的原因(*char 不能分配给 *float),它无法编译。那么,我该怎么做才能绕过它呢?
char *const comStr = "AT+UCAST:0000=0760,0020,0001\r"; // command string
float *pressure;
float *temperature;
uint32_t *timeStamp;
pressure = comStr + 14; // pressure in the address following the '=' in command string
temperature = comStr + 18; // temperature in the address following the 1st ',' in command string
timeStamp = comStr + 22; // time stamp in the address following the 2nd ',' in command string
我对 C 语言中的 struct 和 union 之类的东西有一个不清楚的记忆,它严格保留了在“结构”中定义变量的内存分配顺序。也许是这样的:
typedef struct
{
char[14] command;
float *pressure;
char comma1;
float *temperature;
char comma2;
uint32_t *time_stamp;
char CR;
}comStr;
这个结构能保证 comStr-> command[15] 给我*pressure的第一个/最后一个字节(取决于字节序)吗?还是有什么其他特殊的结构能瞒得过我?
(注意:comStr-> command[15] 不会在以后的代码中进行评估,因此超出索引边界在这里不是问题。这里唯一重要的是内存是否连续分配,以便从内存地址开始持续 29 个字节的硬件获取(comStr-> 命令)给了我我想要的字符串)。
附言在写这篇文章的时候,我想到了一个主意。我可以只使用 memcpy() 吗?) memcpy 有 void* 类型的参数,希望它能工作!我现在要试试!无论如何,所有冰雹stackOverflow!
编辑:我应该让自己更清楚,对于任何误导和误解,我深表歉意!我要构造的字符数组是通过UART逐字节发送的。为此,如果将字符数组的起始存储器地址和长度提供给 DMA 系统,则将使用 DMA 系统将数组自动逐字节传输到发送缓冲区。所以字符数组必须连续存储在内存中。我希望这能让问题更清楚。
【问题讨论】:
-
这可能会导致字符串包含不可打印的字符和/或中间被空字符截断。你确定要这个吗?
-
至 n.m.是的。这是一个用于传输的字符串,在传输完比特后,不可打印的“浮点”字符将再次被解释为浮点数并给出有意义的数据;)非常感谢您的通知;)
-
如果字符串是用于传输而不是显示给人类,那么逗号和
CR是什么意思? -
comma1, comma2 只是为稍后创建这样的结构时插入实际的','字符保留的内存地址。 CR 与为 '\r' 字符(回车)保留的想法相同。
-
需要这些实际的逗号字符...为什么?
标签: c memory-management