Каково поведение этого фрагмента кода C? - PullRequest
0 голосов
/ 13 декабря 2010

Недавно я увидел следующий код:

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

rgb объявлен как указатель на некоторый тип класса.В приведенном выше коде malloc () принимает аргументы, которые имеют ширину * высоту * sizeof (* rgb)

Так что это своего рода самореференциальная инициализация (если я могу вызвать ее, задав это имя!), Т.е.Указатель belore rgb выделяется malloc, он разыменовывает его при вызове malloc.

В этом конкретном коде я увидел, что указатель rgb не инициализируется значением NULL или чем-либо еще.

Каково будет поведение такого кода.

  • Нормальное функционирование или

  • Сбой из-за разыменования нулевого указателя или

  • Разыменование указателя гаража

спасибо,

-AD.

Ответы [ 5 ]

7 голосов
/ 13 декабря 2010

sizeof не оценивает свой операнд, поэтому в этом случае sizeof(*rgb) вернет размер типа rgb, который, я предполагаю, равен fp16 *.

Полностью допустимый C-код.

Если бы он вычислял его, а указатель был просто объявленным указателем без инициализированного значения, то вы бы получили неопределенное поведение.

2 голосов
/ 13 декабря 2010

На самом деле указатель не разыменовывается, sizeof(*rgb) определяет во время компиляции размер типа, на который указывает rgb.В машинном коде, сгенерированном этой строкой, вместо термина sizeof(*rgb) будет использоваться буквенное число.

1 голос
/ 13 декабря 2010

sizeof не оценивает свой аргумент. Он только вычисляет его размер. Таким образом, вы не получите неопределенное поведение , связанное с разыменованием неинициализированного указателя.

0 голосов
/ 13 декабря 2010

В кавычках:

я видел, что указатель rgb не инициализируется значением NULL или чем-либо.if условие.

То есть строка кода в порядке.

0 голосов
/ 13 декабря 2010

При нормальных обстоятельствах блок if не произойдет, когда malloc будет успешнымЕсли malloc не удается, блок будет выполнен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...