2015-12-15 2 views
1

Я пытаюсь создать массив указателей в C. Каждое значение массива должно быть указателем на struct (назовем его struct Type *).Создание массива, содержащего указатели

Если я сделать

struct Type* myVariable= malloc(sizeof(struct Type*)*MY_SIZE); 

или

struct Type** myVariable= malloc(sizeof(struct Type*)*MY_SIZE); 

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

Первый выглядит как обычный массив с int * в качестве содержимого значений.

Как передать хорошее решение функции (по указателю, а не по значению, потому что массив может быть довольно большим) и использовать его в fonction?

+13

второй один ..... –

+3

первый создает массив структурных типов, второй - массив struct Тип poin ters, поэтому выберите второе, чтобы передать его функции, функции которой нужно, кроме аргумента типа struct Type **, затем вызвать вашу функцию и передать в myVariable, объявленный вторым способом –

+1

@Ryan Fitzpatrick: Спасибо, я полностью забыл basics ... Long time no C: '( – Csi

ответ

2

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

// Allocate memory for the array of pointers. 
struct Type** myVariable = malloc(sizeof(struct Type*)*MY_SIZE); 
if (myVariable == NULL) 
{ 
    // Deal with error 
    exit(1); 
} 

for (int i = 0; i < MY_SIZE; ++i) 
{ 
    // Allocate memory for the array of objects. 
    myVariable[i] = malloc(sizeof(struct Type)*THE_SIZE_IN_THE_OTHER_DIMENSION); 
    if (myVariable[i] == NULL) 
    { 
     // Free everything that was allocated so far 
     for (int j = 0; j < i-1; ++j) 
     { 
     free(myVariable[j]); 
     } 
     free(myVariable); 

     // Exit the program. 
     exit(1); 
    } 
} 

Однако, если THE_SIZE_IN_THE_OTHER_DIMENSION будет 1, вы лучше использовать первый подход.

struct Type* myVariable = malloc(sizeof(struct Type)*MY_SIZE); 
            // ^^^^^^^^^^^ Drop the * 
if (myVariable == NULL) 
{ 
    // Deal with error 
    exit(1); 
} 
+0

Итак, если в другом измерении есть размер 1, я просто хочу, чтобы один указатель указывал на одно значение в каждом myVariable [i], я просто делаю myVariable [i] = malloc (sizeof (struct Type)); правильно ? Затем я могу манипулировать содержимым myVariable только с myVariable [i], а не с myVariable [i] [j] (так как j всегда будет 0 в моем случае) – Csi

+0

@Csi, «да» к первому вопросу, «нет» ко второму вопрос. Когда второе измерение равно 1, вам нужно использовать 'myVariable [i] [0]' или '* myVariable [i]'. –

+0

Если второе измерение равно '1', вам лучше использовать первый подход из вашего вопроса. В этом случае вы можете использовать 'myVariable [i]' для доступа к объекту. –

0

Ни то, ни другое!

Используйте идиомы, что уменьшает работу и ошибки

pointer = malloc(sizeof *pointer * Number_of_elements); 

Или в случае ФП в «чтобы создать массив указателей в C»

#define ARRAY_N 100 
struct Type **myVariable = malloc(sizeof *myVariable * N); 
if (myVariable == NULL) Handle_OutOfMemmory(); 

Теперь установить эти указатели на некоторую величину

#define M 50 
size_t i; 
for (i=0; i<N; i++) { 
    myVariable[i] = malloc(sizeof *(myVariable[i]) * M); 
    if (myVariable[i] == NULL) Handle_OutOfMemmory(); 

    for (size_t m = 0; m<M; m++) { 
    // Initialize the fields of 
    myVariable[i][m].start = 0; 
    myVariable[i][m].value = 0.0; 
    myVariable[i][m].set = NULL; 
    } 
} 
Смежные вопросы