OR操作时出现Seg Fault

时间:2015-02-05 15:17:34

标签: c pointers segmentation-fault

我有以下代码:

#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)

4 个答案:

答案 0 :(得分:4)

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

要计算该值,您可以这样做。

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

要计算PORT_TYPEport_id的按位或指针,您可以这样做:

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

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

请注意,上面的不会取消引用生成的指针,因为这样做并不能保证(并且通常非常不可能)所以会有效。

答案 1 :(得分:2)

这个问题很少与OR操作有关。

问题在于,您尝试取消引用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