指针和值的C大小指向不匹配

时间:2013-10-09 04:18:18

标签: c pointers size

适用于msp430的IAR Embedded Workbench。选择C标准99

您好,我是指针新手并且卡在一个地方。这是代码的一部分:

void read_SPI_CS_P2(uint8_t read_from, int save_to, uint8_t bytes_to_read)
{
        uint8_t * ptr;
        ptr = save_to;
...

从我读到的关于指针的内容我认为:

uint8_t * ptr; - 这里我声明了什么类型的数据指针指向(我想保存uint8_t值)

ptr = save_to; - 这里我分配了我想写的内存地址(它是0xF900所以int)

它给我一个错误[Pe513]:类型" int"的值无法分配到" uint8_t *"

类型的实体

问题是......为什么?保存(save_to)数据的大小和内存地址的大小可能不同?

2 个答案:

答案 0 :(得分:0)

从语法的角度来看,您可以直接将int转换为更改其值的指针。但在这种情况下,这可能不是一个好主意或能帮助你的东西。

您必须使用编译器和链接器支持来指示您希望在内存中的特定位置使用某些数据。通常,您可以使用 #pragma location 语法执行此操作(使用IAR工具链),使用类似:

__no_init volatile uint8_t g_u8SavingLocation @ 0xF900;

您不能简单地在内存中设置指针的值并开始在该位置写入。链接器负责决定内存中的内容,并且您可以使用#pragma和链接器设置文件来指示您想要实现的内容。

答案 1 :(得分:0)

C语言没有直接的功能可以让你创建指向任意数字地址的指针。在C语言中,指针是通过获取现有对象的地址(使用一元&运算符)或通过接收来自内存分配函数(如malloc)的指针获得的。此外,您可以创建空指针。在所有这些情况下,您永远不会知道,也永远不需要知道指针的实际数值。

如果你想让你的指针指向一个特定的地址,那么正式的抽象C语言无法帮助你。语言中根本没有这样的功能。但是,在语言的实现相关部分中,特定编译器可以保证,如果强制将整数值(包含数字地址)转换为指针类型,则结果指针将指向该地址。因此,如果在您的情况下数字地址存储在save_to变量中,您可以使用显式强制转换将其强制转换为指针

ptr = (unit8_t *) save_to;

演员表是必需的。在标准C中不允许直接为指针分配整数值。(过去曾允许在预标准C中使用)。

存储整数地址的更好类型是uintptr_tint或任何其他签名的类型,对于此目的来说当然不是一个好的选择。

P.S。当你谈到尺寸时,我不确定你想要做什么。 “将保存的数据大小”与内存地址大小之间没有关系。为什么呢?