Инициализация указателя на структуру - PullRequest
5 голосов
/ 09 июня 2011

другой связанный вопрос - Ошибка сегментации при использовании strcpy ()?

У меня есть структура:

struct thread_data{    
    char *incall[10];
    int syscall arg_no;    
    int client_socket;
 }; 

Как инициализировать указатель на структуру вышеупомянутого типа, а также инициализировать указатель на 10 строк (incall []) внутри структуры.

Должен ли я сначала инициализировать строки, а затем структуру.

Спасибо.

Редакция: я полагаю, я использовал не то слово и должен был сказать «распределить» На самом деле я передаю эту структуру в качестве аргумента для потоков. Число потоков не является фиксированным, и структура данных, отправляемая в качестве аргумента, должна быть уникальной для каждого потока, и «потокобезопасность», т. Е. Не может быть изменена другими потоками.

Ответы [ 6 ]

11 голосов
/ 09 июня 2011

Вот ответ на вопрос, который я думаю вы задаете:

/**
 * Allocate the struct.
 */
struct thread_data *td = malloc(sizeof *td);

/**
 * Compute the number of elements in td->incall (assuming you don't
 * want to just hardcode 10 in the following loop)
 */
size_t elements = sizeof td->incall / sizeof td->incall[0];

/**
 * Allocate each member of the incall array
 */
for (i = 0; i < elements; i++)
{
  td->incall[i] = malloc(HOWEVER_BIG_THIS_NEEDS_TO_BE);
}

Теперь вы можете назначать строки для td->incall следующим образом:

strcpy(td->incall[0], "First string");
strcpy(td->incall[1], "Second string");

В идеале вы хотите проверить результат каждого malloc, чтобы убедиться, что он был успешным, прежде чем переходить к следующему.

6 голосов
/ 09 июня 2011

Соответствующий инициализатор struct может выглядеть следующим образом:

struct thread_data a = {
  .incall = {"a", "b", "c", "d", "e"},
  .arg_no = 5,
  .client_socket = 3
};

Тогда вы можете назначить адрес этого указателя:

struct thread_data *b = &a;
2 голосов
/ 09 июня 2011

Зависит от того, нужна ли вам временная переменная или нет:

struct thread_data data; // allocated on the stack
// initialize your data.* field by field.

struct thread_data* data = malloc(sizeof (struct thread_data)); // allocated on the heap
// initialize your data->* field by field.

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

1 голос
/ 09 июня 2011

Вот еще одна возможность.Мне неясно, для чего вы хотите инициализировать значения, так что это просто захватывает число из воздуха, что почти наверняка неверно.

struct thread_data *td;
int i;
// allocate memory for the structure
td = malloc( sizeof( struct thread_data ));
// then allocate/initialize the char* pointers.  It isn't clear
// what you want in them ... pointers to existing data?  Pre-allocated
// buffer?  This just allocates a fixed size buffer,
for ( i = 0; i < sizeof( td->incall ) / sizeof( td->incall[0] ); i++ )
   td->incall[i] = malloc( 42 );
1 голос
/ 09 июня 2011

я думаю malloc(sizeof(struct thread_data)); должно работать, не так ли?

1 голос
/ 09 июня 2011

Вы можете написать что-то вроде этого:

#define ARRAY_DIMENSION(a) (sizeof(a)/sizeof((a)[0]))

void init_func(void)
{
    struct thread_data arg_to_thread;
    int i;
    char buffer[100];

    buffer[0] = '\0';

    for ( i = 0; i < ARRAY_DIMENSION(arg_to_thread.incall); i ++ )
    {
         /* Do something to properly fill in 'buffer' */

         arg_to_thread.incall[i] = strdup(buffer);
    } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...