2011-02-08 2 views
1

следующая структура, и я хочу создать массив этой структуры в C и инициализировать, но путайте с тем, как инициализировать char **input и char **output.как инициализировать структуру, содержащую указатель на указатель

typedef struct _test_data_vector { 
    char *api; 
    char **input; 
    char **output; 
}vector_test_data; 

следующее - это то, что я пробовал.

typedef struct _test_data_vector { 
    char *api; 
    char **input; 
    char **output; 
}vector_test_data; 

vector_test_data data[] = { 
    { 
     "vector_push_back", 
     {"1","2","3","4","5","6","7","8","9","10"}, 
     {"1","2","3","4","5","6","7","8","9","10"} 
    } 
}; 
+0

Ну, инициализируйте их для чего? Для реальной таблицы строк? Или просто установите 0? – Christian

ответ

1

Вы очень близки, просто указать тип через compound literals (начиная с С99)

Это то, что я испытывал, без предупреждений:

typedef struct _test_data_vector { 
    char *api; 
    char **input; 
    char **output; 
}vector_test_data; 

vector_test_data data[] = { 
    { 
     "vector_push_back", 
     (char*[]){"1","2","3","4","5","6","7","8","9","10"}, 
     (char*[]){"1","2","3","4","5","6","7","8","9","10"} 
    } 
}; 

printf("TEST: %s", data[0].input[2]); 

: Тест Задачи и результаты: 3

+0

Нет, это не сработает. Это не будет двумерный массив, а скорее какая-то уродливая типичная мерзость. Вы пытались printf («TEST:% s», данные [1] .input [0]); – Lundin

+0

@ Lundin Пожалуйста, верните мой голос, обратите внимание, что вы просто исчерпали границы массива 'data'. У этого есть только ** один ** элемент! Это не странно, просто проконсультируйтесь с этим: [Compound Literals] (http://gcc.gnu.org/onlinedocs/gcc-3.1.1/gcc/Compound-Literals.html) –

+0

@Martin Зачем использовать указатель- если вы не собираетесь использовать несколько измерений? Если бы вы заявили об этом правильно, у вас была бы [10] [3] матрица, 10 измерений с 3 символами в каждой. Кроме того, это не имеет ничего общего с сложными литералами, вы получите эту же проблему независимо от того, как используется указатель на указатель. – Lundin

0

быть немного более конкретными, как правило, когда вы должны инициализировать указатель на указатель вы делаете это так:

char * charPointer;//this is the char you want the input to point at; 
*input = charPointer; 

Я должен был использовать указатель на указатель на проекте, но если то вы можете избежать этого, было бы проще.

0

api, input и output будут по умолчанию инициализироваться значением NULL. Вы можете инициализировать api напрямую, но вход и выход должны быть выделены либо во время компиляции, определяя массивы, либо во время выполнения, возможно, через malloc. Вы действительно должны предоставить больше информации о том, что вы пытаетесь сделать, чтобы получить более полезный ответ.

0
 
char text[] = "Input text"; 
char *output; 
struct _test_data_vector { 
    char *api; 
    char **input; 
    char **output; 
}; 

struct _test_data_vector A = { NULL, &text, &output }; 

Если вы хотите выделить им место, то вы также можете:

 
struct _test_data_vector B = { 
    "api", 
    malloc(5 * sizeof *B.input), 
    malloc(10 * sizeof *B.output) 
}; 

просто убедитесь, что вы проверяете, что распределение было успешным. (Я решительно против , так как гораздо проще вызывать malloc в коде без инициализации.)