Неопределенное поведение с 2d массивом структуры C - PullRequest
1 голос
/ 14 марта 2019

У меня есть двумерный массив структур, которым я назначаю строки, вот моя структура.

struct node {
  char* value;
};

Вот мое распределение (я новичок в C, поэтому я не уверен, правильно ли это), но всегда будет 35 столбцов, но может быть миллионы строк (сейчас у меня было только 3 для тестирования)

const int rows=3;
    struct node ** arrayofnodes[rows][35];
for(int i=0; i<rows; i++) {
    array[i] = malloc(test * sizeof array[0]);
    for(int j=0; j<35; j++) array[i][j] = malloc(sizeof array[0][0]);
}

Затем я читаю символ за символом из файла csv и получаю временную строку и присваиваю значение temp нужной позиции, используя это ниже.

//int row and count are defined in my while loop I have for counting commas(or what col I am on) then new lines for the rows 
arrayofnodes[row][count]->value=strdup(temp);
   printf("%s  \n", arrayofnodes[row][count]->value);
   printf("%d %d \n",row, count );

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

Например, приведенный выше выводит что-то вроде

Red
0 0

И это правильно для этой позиции.

Но потом, после того как я выполнил все свои поручения. Я поместил оператор print printf("%s \n", arrayofnodes[0][0]->value);, чтобы проверить, могу ли я получить 1-е значение, как показано выше, которое должно быть «Красным».

В моем терминале выводится "@` ?? " или "@Pz?" или просто любой случайный вывод. Я пробовал это на кучу разных позиций, кроме 0,0, но все они получают одинаковый результат. Я думаю, я просто запутался, почему операторы print работают сразу после того, как я их назначил, но не в конце моего кода, когда я вызываю их позже.

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Похоже, вы пытаетесь это сделать. Вам нужно будет отсканировать CSV-файл и вычислить необходимое количество строк, а затем заполнить значения так, как вы хотите.

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

struct node {
  char* value;
};

int main() {
  const int rows = 3; // you will need to compute this beforehand
  const int columns = 35;

  struct node** arrayofnodes = malloc(rows * sizeof(struct node*));

  for (int i = 0; i < rows; ++i) {
    arrayofnodes[i] = malloc(columns * sizeof(struct node));
  }

  for (int i = 0; i < rows; ++i) {
    for (int j = 0; j < columns; ++j) {
      arrayofnodes[i][j].value = malloc(...);
      strcpy(arrayofnodes[i][j].value, ...); // etc..
    }
  }

  for (int i = 0; i < rows; ++i) {
    for (int j = 0; j < columns; ++j) {
      free(arrayofnodes[i][j].value);
    }
  }

  for (int i = 0; i < rows; ++i) {
    free(arrayofnodes[i]);
  }

  free(arrayofnodes);
}
0 голосов
/ 14 марта 2019

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

struct OneRow
{
    char Value[35];
}

const int Rows=3;

OneRow *MyArray=NULL;

MyArray = (OneRow*) malloc (Rows*sizeof(OneRow));

Теперь вы можете получить доступ к каждому элементу (символу) или целой строке как

MyArray[rownumber].Value[colnumber] = …
strcpy (MyArray[rownumber].Value, "I'm_shorter_than_35"); //34 chars max + null-term
...