Как установить «конец» массива структур - PullRequest
0 голосов
/ 23 сентября 2019

Я хотел бы установить эквивалент \0 в конце массива структур, чтобы я знал, когда он заканчивается.

Пока что я пытаюсь сделать что-то вроде этого:

typedef struct {
    char * id;
    char * date;
} ROW;

int main(int argc, char *argv[]) {

    FILE * fp = fopen("test100k.csv", "r");
    ROW * rows = malloc(sizeof(row) * 10000);
    int row_num = 0;
    ROW row;
    char buffer[255];

    while(fgets(buffer, sizeof(buffer), fp) != NULL) {  
        // some logic to set the object
        rows[row_num++] = row;
    }

    rows[row_num] =  NULL; // how to do this?

}

Каким будет правильный способ "завершить" массив строк?

Ответы [ 3 ]

1 голос
/ 24 сентября 2019

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

#include <stdlib.h>
#include <stdio.h>

typedef struct {
    char * id;
    char * date;
} ROW;

/* Initialising the ROW's members below to a literal could lead to 
   ambiguities, as the compiler is free to merge the same literal 
   appearing more then once into only one instance in memory. 
   Whereas initialising the members to the struct's address itself 
   guarantees the uniqueness of the address stored.
   (Just do not ever dereference it, at least not without casting it 
   back to the type ROW.) */

const ROW STOPPER_ROW = {(char*)&STOPPER_ROW, (char*)&STOPPER_ROW};

int main(int argc, char *argv[]) {
    ...

    ROW * rows = malloc(10000 * sizeof *rows);
    size_t row_num = 0;
    ...

    while(NULL != fgets(buffer, sizeof(buffer), fp) && 
          10000 > row_num) {    
        // some logic to set the object
        rows[row_num++] = row;
    }

    rows[row_num] = STOPPER_ROW;

    row_num = 0;
    /* Comparing only one member below in fact would do. */
    while (rows[row_num].id != STOPPER_ROW.id && 
           rows[row_num].date != STOPPER_ROW.date)
    {
        /* Use rows[row_num] here */
        ++row_num;
    }
}
0 голосов
/ 24 сентября 2019

Это стандартные подходы:

  • Добавить переменную счетчика, которая будет указывать последний действительный индекс.
  • Сохранять строки по ссылке, а не по значению.Т.е. выделите место для каждой строки и сохраните указатель на нее в массиве вместо хранения самой строки.Строка недействительна, если указатель равен нулю.
  • Если для строки известно известное недопустимое значение, инициализируйте все ячейки массива этим значением.Ячейка с недопустимым значением будет указывать конец допустимых элементов.
0 голосов
/ 23 сентября 2019

Вы можете попробовать использовать memset:

memset(&rows[row_num], NULL, sizeof(ROW));
...