размер структуры - size_t в с - PullRequest
1 голос
/ 09 марта 2010

По какой-то причине я продолжаю получать ошибку сегментации, когда пытаюсь получить размер моей структуры.

struct my_struct {
  char *a;
  int  b;
};

int main(int argc, char *argv[])
{
    struct my_struct dastruct;
    size_t len = sizeof(dastruct) / sizeof(struct my_struct); // error
    qsort(dastruct, len, sizeof(struct my_struct), cmp);
    ...
}

Есть идеи, что я делаю не так? Спасибо

Ответы [ 4 ]

2 голосов
/ 09 марта 2010

Если вы получаете сбой конкретно на

size_t len = sizeof(dastruct) / sizeof(struct my_struct); 

строка, это может быть вызвано sizeof(struct my_struct) оценкой до 0. (Т.е. проблема на самом деле в делении на ноль). Это может произойти в некоторых компиляторах, когда тип struct my_struct является неполным, т.е. он не определен. Использование неполного типа в sizeof недопустимо в C, но некоторые компиляторы по какой-то причине допускают это, оценивая его как 0. (Хотя я ожидаю, что компилятор перехватит это деление на 0 во время компиляции.)

Ваш код явно фальшивый и не иллюстрирует проблему. Если приведенная выше теория верна, скорее всего, в вашем реальном коде вы либо неправильно набрали имя типа struct my_struct в sizeof, либо забыли включить определение типа struct my_struct.

(Маловероятно, но в любом случае ...)

1 голос
/ 09 марта 2010

Вы, вероятно, хотите сделать dastruct массивом.

   struct my_struct dastruct[10];

Редактировать: Вы также не дали cmp, поэтому невозможно сказать, если там что-то не так (я вижу, это место, где происходит ошибка сегментации).

0 голосов
/ 09 марта 2010

Если ваш опубликованный код является вашим полным кодом, значит, вы не смогли инициализировать указатель a члена dastruct, поэтому он указывает на неверное местоположение. Когда qsort() вызывает cmp(), который предположительно использует этот указатель (вы не показывали этот код), вы, скорее всего, получите segfault.

Обратите внимание, что я предполагаю, что ваш segfault происходит в каком-то месте , отличном от инициализации len, которая делит только две константы (что, вероятно, произойдет во время компиляции в любом случае).

0 голосов
/ 09 марта 2010

Единственное, что я могу видеть, это то, что ты забыл #include <stdlib.h>. Помните, что C неявно объявляет qsort при первом использовании.

...