Прикол с инициализацией константного массива

Jan 23, 2024 16:53

Бился с полчаса в попытках понять, откуда у меня сегфолт взялся. Пока просто шутки ради не написал вот так:

// text messages for `cc_hresult`
static const char *resmessages[] = {
[RESULT_OK] = "OK",
[RESULT_BUSY] = "BUSY",
[RESULT_FAIL] = "FAIL",
[RESULT_BADVAL] = "BADVAL",
[RESULT_BADKEY] = "BADKEY",
NULL
};

То бишь явно NULL в конце добавил. И - бдыщ! Перестало сегфолтится.
А я все эти годы уверенно считал, что при неполной инициализации массива все остальные элементы будут нулями. А вот хрен, оказывается!

Здесь пишут, что как-то все неоднозначно. В общем, для гарантии безопасности нужно вообще все элементы инициализировать, т.к. вышеприведенный код у значения с номером 6 вызывает сегфолт (т.к. там будет рандомный указатель).

Теперь надо найти, почему после выделения сетевых функций в отдельную библиотеку у меня транспорт изображения работать перестал.

рукожопие, c

Previous post Next post
Up