Инициализация массива внутри структуры в C - PullRequest
0 голосов
/ 08 декабря 2010

Я пытаюсь разрешить массив переменной длины внутри структуры в C-программе. Примерно так:

struct result{
    int column;
    int row;
    const char* a[var][var];  
};

как мне это сделать?

подойдет даже следующее определение:

struct result{
    int column;
    int row;
    const char* a[row][column];
};

Пожалуйста, помогите ...

Ответы [ 4 ]

2 голосов
/ 08 декабря 2010

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

P.S .: Если вам нужен двумерный массив, используйте указатель на указатель (то есть выделите память для массива указателей)

2 голосов
/ 08 декабря 2010

У вас не может быть массивов переменного размера в структурах C.

У вас могут быть указатели на массивы, которые могут иметь переменный размер (вам нужно обрабатывать выделение пространства отдельно), но вы объявляете массивывместо указателей

Если вам нужен массив указателей, попробуйте

const char (*a)[][];

(вам нужно будет управлять массивом как массивом указателей на массивы, если вы хотите, чтобы оба измерения былипеременная)

1 голос
/ 08 декабря 2010

Для одномерных массивов вы можете сделать что-то вроде этого:

struct TEST {
    ...
    int size;
    char string[];
}

где поле размера указывает количество символов в строковом массиве. Массив должен быть последним членом структуры, и вы должны динамически распределять память структуры. В этом случае выделенный размер должен быть sizeof(struct TEST) + size * sizeof(char).

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

struct TEST {
    ...
    int size;
    char string[][100];
}

EDIT:

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

РЕДАКТИРОВАТЬ 2:

Это часть, по крайней мере, стандарта ISO C99. Бесстыдное копирование из пункта 6.7.2.1, подпункт 16:

16 Как особый случай, последний элемент структуры с более чем одним указанный член может иметь неполный тип массива; это называется гибким член массива. С двумя исключениями, член гибкого массива игнорируется. Во-первых, размер структуры должен быть равным смещению последнего элемент в остальном идентичный структура, которая заменяет гибкий член массива с массивом неопределенная длина.106) ...

1 голос
/ 08 декабря 2010

Использовать динамическое размещение с функцией malloc.

В вашем случае вы должны сделать что-то вроде:

#include <stdlib.h> /* header file for the malloc function */

void allocateResult(struct result* res, int row, int column) {
    res->a = (const char*) malloc(row * column * sizeof(char));
}

Обратите внимание, что sizeof(char) равно 1 (почти все время), но для других типов вам придется делать это таким образом.

Это решение подразумевает освобождение выделенной памяти до завершения программы. Вам нужно будет передать указатель в своей структуре на свободный:

void freeResult(struct result* res) {
   free(res->a);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...