Проблема структуры данных - PullRequest
3 голосов
/ 29 октября 2010

Я сделал такую ​​структуру:

struct ponto {
    int x;
    int y;
    int z;
};

1) Могу ли я инициализировать int со значением по умолчанию? int var = value; не похоже на работу, компилятор говорит "синтаксическая ошибка перед '=' токеном" или что-то в этом роде.

2) Мне нужно работать с некоторыми из них, как в массиве структур, но я знаю только, сколько мне нужно после запуска приложения, после чтения файла. Как я могу Malloc это?

Заранее спасибо

РЕДАКТИРОВАТЬ: так много ответов, я благодарен. К сожалению, я могу отметить только один

Ответы [ 7 ]

2 голосов
/ 29 октября 2010

а) Вы можете инициализировать с помощью

struct pronto p = {1,2,3};

В последних компиляторах (не знаете, насколько это переносимо, думаете, что это C99?)

b) Вы можете выделить массив с помощью malloc:

struct pronto *array = malloc(sizeof(struct pronto) * NUMBER);
1 голос
/ 29 октября 2010
struct ponto* create_and_init_ponto(int n)
{
    struct ponto* array;
    int i;

    array = (struct ponto*)malloc( n * sizeof(struct ponto) );

    for ( i = 0; i < n; ++i )
    {
        array[ i ].x = 0;
        array[ i ].y = 0;
        array[ i ].z = 0;
    }

    return array;
}
1 голос
/ 29 октября 2010

Чтобы инициализировать элементы структуры в 0 , выполните:

struct ponto foo = { 0 };

В malloc() массив нужного размера, выполните:

struct ponto *arr = (struct ponto *) malloc(COUNT * sizeof(struct ponto));

Не забудьте free() массив, когда вы закончите с ним.

0 голосов
/ 29 октября 2010

1) Нельзя задавать значения по умолчанию для конкретной структуры для ее элементов на уровне языка, поскольку все переменные в C неинициализированы, если вы явно не инициализируете их (или не делаете их статическими / внешними, в этом случае они инициализируем). Если вы спроектируете свои структуры так, чтобы все нули были хорошим набором начальных значений, вы всегда можете инициализировать так:

struct foo myfoo = {0};

{0} служит универсальным инициализатором нуля, который работает для любого типа.

Если вам нужны разные значения по умолчанию, лучше всего использовать макрос и документировать, что код, использующий вашу структуру, должен использовать макрос:

#define FOO_INITIALIZER { 1, 2, 3 }
struct foo myfoo = FOO_INITIALIZER;

2) Если вы знаете, прежде чем начать использовать какую-либо структуру, сколько вам понадобится, просто malloc их все, как только вы знаете число:

if (count > SIZE_MAX / sizeof *bar) abort();
struct foo *bar = malloc(count * sizeof *bar);

Обратите внимание на правильную идиому для вызова malloc и избежания уязвимостей переполнения.

Если вы не знаете нужного вам числа, пока не начнете с ними работать, начните с выделения приличного числа, а если закончите, увеличьте число на фиксированное значение, например, удвоив размер обычный и легкий Вы хотите проверить наличие переполнений здесь. Затем используйте realloc.

0 голосов
/ 29 октября 2010
  1. Нельзя использовать значения по умолчанию для элементов структуры.Пространство не выделено для определения структуры.Вы просто создаете новый тип (например, встроенный int).Когда вы на самом деле определяете переменную типа ponto, ей будет выделено место.

  2. Вы можете сделать обоснованное предположение о том, сколько вам нужно, выделить для этого место (используя malloc ) и продолжить.Если вы обнаружите, что достигли предела, вы можете использовать функцию realloc для изменения размера массива.

0 голосов
/ 29 октября 2010

Вы создали структуру определение , теперь вам нужно создать переменную этой структуры, прежде чем вы сможете установить поля:

struct ponto xyz;
xyz.x = 7;

Чтобы выделить достаточно места:

int need_to_have = 24;
struct ponto *pontos = malloc (need_to_have * sizeof(struct ponto));
0 голосов
/ 29 октября 2010

Вопрос № 1: Если вам нужно инициализировать int со значением:

struct ponto p1;
p1.x = p1.y = p1.z = 3;  // initializing with three

В качестве альтернативы, если вы хотите инициализировать все значения в 0, вы можете использовать memset следующим образом:

memset(&p1, 0, sizeof(struct ponto));

Вопрос № 2: Для использования malloc:

struct ponto *ps;
ps = (struct ponto *)malloc(N*sizeof(struct ponto));
// where N is your element count.

Это выделит память для хранения N элементов типа struct ponto. После этого вы можете инициализировать его значения с помощью:

int initvalue = 3; // assuming you want to initialize points with value 3
for (i=0; i<N; i++) {
    ps[i].x = ps[i].y = ps[i].z = initvalue;
}
...