我有以下代码:
#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);
}
这让我陷入了错误。我打算对OR进行变量,以获得32位值(0x01123456)
答案 0 :(得分:4)
您正在取消引用指针iptr
,其值不是有效的可写内存位置。这会触发未定义的行为,在您的情况下会出现分段错误。
要计算该值,您可以这样做。
printf("0x%08x\n", PORT_TYPE | port_id);
要计算PORT_TYPE
和port_id
的按位或指针,您可以这样做:
uint32_t *iptr = (uint32_t *) (PORT_TYPE | port_id);
强制转换是必要的,因为值是按位OR:ed不是指针(你不能按位或指针)。
请注意,上面的不会取消引用生成的指针,因为这样做并不能保证(并且通常非常不可能)所以会有效。
答案 1 :(得分:2)
这个问题
问题在于,您尝试取消引用NULL
内存,导致undefined behaviour将副作用显示为分段错误。
在您的代码中,您iptr
设置为NULL
。您不应该访问NULL
内存。在实际使用之前,您必须将内存分配给iptr
。
试试这个
uint32_t *iptr = NULL;
iptr = malloc (sizeof (uint32_t *)); // allocate memory dynamically.
if (iptr) //check for success of malloc
*iptr = (PORT_TYPE | port_id);
else
// don't use iptr, do something else, or return.
一旦你完成了,别忘了free()
记忆。
注意:此外,最好使用int main()
和return
语句。
编辑:
根据您的最新修改,
iptr = (uint32_t *) (sizeof(uint32_t));
不 分配记忆。
答案 2 :(得分:1)
您正在尝试通过NULL指针进行写入:
*iptr = <anything>
会导致分段错误,因为iptr指向NULL。你不能写NULL。
答案 3 :(得分:1)
将*iptr
替换为iptr
以分配给iptr
:
iptr = (PORT_TYPE | port_id);
这会将(PORT_TYPE | port_id)
的结果分配给iptr
。
使用*iptr
将分配给地址(uint32_t *) (sizeof(uint32_t))
的内存(等于4
,这是变量的无意义内存地址,在大多数系统上都是如此),这就是为什么seg故障发生了。
将内存动态分配给iptr
:
iptr = malloc(sizeof(uint32_t));
这将分配sizeof(uint32_t)
个字节的内存,并将该内存的地址分配给iptr
。