повторяющаяся ошибка сегментации при использовании strcpy - PullRequest
0 голосов
/ 30 марта 2012

Получение ошибки сегментации для следующего кода. Пожалуйста, сообщите.

struct columns {
      char* c_name;
      char* c_type;
      char* c_size;
};

int main(int argc, char* argv[])
{
  int column_num = 3;
  struct columns col[10];
  //columns *col = (columns*) malloc (sizeof(columns) * column_num);
  strcpy(col[0].c_name, "PSID");
  strcpy(col[0].c_type, "INT");
  strcpy(col[0].c_size, "4");
}

Я использую 2 способа выделить место для структуры столбцов, но продолжаю получать ошибку сегментации. Я что-то упустил?

Ответы [ 5 ]

5 голосов
/ 30 марта 2012

Ни один из ваших указателей в структуре фактически ни к чему не инициализирован.Вы должны дать им измерение или динамически выделить им память.

2 голосов
/ 30 марта 2012

Попробуйте это (strdup заботится о хранении, но не забудьте освободить, когда вы закончите):

struct columns {
  char* c_name;
  char* c_type;
  char* c_size;
};

int main(int argc, char* argv[])
{
  int column_num = 3;
  struct columns col[10];

  col[0].c_name = strdup("PSID");
  col[0].c_type = strdup("INT");
  col[0].c_size = strdup("4");

  return 0;
}
2 голосов
/ 30 марта 2012

col[0].c_name - указатель, но не указывает на какую-либо память.Вот почему он будет зависать.

Прежде чем что-либо копировать в него, выделите часть памяти, используя массив char c_name[256]; или malloc().

.
1 голос
/ 30 марта 2012

Вы выделяете пространство для columns структуры, но не для строк, которые вы хотите сохранить.Ваши указатели (например, c_name) остаются неинициализированными, указывая на некоторые случайные области памяти, поэтому вы сразу вызываете неопределенное поведение.

1 голос
/ 30 марта 2012

Вы никогда не выделяете память и не инициализируете свои char* указатели.

Как

strcpy(col[0].c_name=malloc(sizeof "PSID"),"PSID");

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

...