我有以下代码:

#include <stdio.h>
#include <inttypes.h>
#define PORT_TYPE 0x01000000
main(){
    uint32_t port_id = 0x00123456;
    uint32_t *iptr = NULL;
    iptr = (uint32_t *) (sizeof(uint32_t));
    *iptr = (PORT_TYPE | port_id);
}


这让我感到很不对劲。我的意图是要么都将其变量化以获取32位值(0x01123456)

最佳答案

您正在取消引用指针iptr,其值不是有效的可写内存位置。触发未定义的行为,在您的情况下为分段错误。

仅计算值,您可以执行例如

printf("0x%08x\n", PORT_TYPE | port_id);


要计算PORT_TYPEport_id的按位或的指针,可以执行以下操作:

uint32_t *iptr = (uint32_t *) (PORT_TYPE | port_id);


强制转换是必需的,因为按位或:ed的值不是指针(不能按位或指针)。

请注意,以上内容从未取消对结果指针的引用,因为无法保证(通常,很不可能)这样做是有效的。

07-25 21:54