这段C代码片段的行为是什么?

时间:2010-12-13 16:21:40

标签: c pointers malloc

最近我看到了以下片段代码:

if ((rgb = (fp16 *)malloc(width*height*sizeof (*rgb)*3)) == NULL)

rgb被声明为某种类类型的指针。 在上面的代码中,malloc()接受的参数是width * height * sizeof(* rgb)

所以它是某种自引用初始化(如果我可以通过给出这个名字来调用它!) 即belore rgb指针由malloc分配,它在调用malloc时解除引用它。

在这个特定的代码中,我看到指针rgb没有初始化为NULL或任何东西。

此类代码的行为是什么。

  • 正常运作或

  • 由于空指针取消引用或

  • 而崩溃
  • 车库指针取消引用

感谢,

-AD。

5 个答案:

答案 0 :(得分:7)

sizeof不评估其操作数,因此在这种情况下,sizeof(*rgb)将返回rgb类型的大小,我假设它是fp16 *

完全有效的C代码。

如果确实评估了它并且指针只是一些没有初始值的声明指针,那么你将得到未定义的行为。

答案 1 :(得分:2)

实际上并没有解除引用指针,sizeof(*rgb)执行rgb指向的类型大小的编译时确定。该行生成的机器代码将使用文字数代替sizeof(*rgb)项。

答案 2 :(得分:1)

sizeof不评估其论点。它只计算它的大小。因此,您不会将未定义的行为与未初始化的指针解除分配相关联。

答案 3 :(得分:0)

在正常情况下,当malloc成功时,if块不会发生。如果malloc失败,则将执行该块。

答案 4 :(得分:0)

引用:

  

我看到指针rgb不是   初始化为NULL或任何东西。

如果rgb初始化为NULL,那么它将经历if条件。

这就是代码行很好。