Как правильно использовать memset в элементе struct? - PullRequest
1 голос
/ 08 марта 2012

Я пытаюсь использовать memset для элемента структуры, например так:

memset( &targs[i]->cs, 0, sizeof( xcpu ) );

Однако при этом возникает ошибка сегментации. Я не понимаю, почему это не помогает, и как я могу заставить его работать. Как правильно использовать memset для элемента структуры и почему мой метод не работает?

Строка, которая выделяет память для targs:

eargs **targs = (eargs **) malloc(p * sizeof(eargs *));

Определения структуры для элемента struct cs (xcpu_context) и struct targs (execute_args):

typedef struct xcpu_context {
  unsigned char *memory;              
  unsigned short regs[X_MAX_REGS];    
  unsigned short pc;                  
  unsigned short state;              
  unsigned short itr;                 
  unsigned short id;                 
  unsigned short num;                 
} xcpu;

typedef struct execute_args {
    int ticks;
    int quantum;
    xcpu cs;
} eargs;

Ответы [ 2 ]

2 голосов
/ 08 марта 2012

Вы выделили массив указателей в строке

eargs **targs = (eargs **) malloc(p * sizeof(eargs *));

, но сами элементы не инициализированы.Таким образом, этот segfault не имеет ничего общего с правильным использованием memset в полях структуры, но вместо этого происходит из-за использования uininitialized памяти (при условии, что у вас нет цикла для инициализации каждого объекта eargs после выделения массива указателей).

Вместо этого, если вы хотите выделить динамический массив объектов p eargs (здесь я свободно использую термин «объекты»), вместо этого вы должны написать

eargs *args = malloc(p * sizeof(eargs));
if (!args) {
    /* Exit with an error message */
}
memset(&(args[i].cs), 0, sizeof(xcpu));

.Обратите внимание, что args - это динамически распределяемый массив объектов eargs, , а не - динамически распределяемый массив указателей, поэтому он имеет тип eargs *, а не eargs **.

.
1 голос
/ 08 марта 2012

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

for (i = 0; i < p; i++)
    targs[i] = malloc(sizeof(eargs));

Как только вы на самом деле будете иметь структуры для работы, ваш memset() вызов будет в порядке.

...