2013-04-17 4 views
1

Так что у меня этот кусок кодазЬгстр ошибка сегментации с массивом структур

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "hw09-header.h" 

struct student 
{ 
    char* name; 
    char* course; 
}; 

int main(int argc, char* argv[]) 
{ 
    int i = 0, init_size=10,x,z; 
    char *value = "go"; 
    int key, count=0; 
    char* del = ","; /*Uses comma sign as delimiter*/ 
    char *token=NULL; 
    char *temp_stor; 
    struct student *array; 
    struct student *temp; 

    if(argc != 2) 
    { 
     printf(" usage: program_name positive_integern"); 
     printf("example: ./example-hw09 123n"); 
     exit(1); 
    } 

    /************** begin REQUIRED **************/ 
    /* put before logic. DO NOT PUT IN A LOOP */ 
    key = atoi(argv[1]); 
    initialize(key); 
    /************** end REQUIRED **************/ 

    /* example loop */ 

    array=malloc((init_size)*sizeof(int)); 

    while(strcmp(value, "stop") != 0) 
    { 
     value = getString(); 
     token = strtok(value, del); 
     while (token !=NULL) 
     { 
      if(i%4==0) 
      { 
       init_size=init_size*2; 
       temp = realloc(array,init_size*sizeof(int)) ; 
       if(temp != NULL) 
       { 
        array = temp; 
       } 
       else 
       { 
        printf("unable to reallocaten"); 
        exit(1); 
       } 
      } 

      array[i].name=malloc(sizeof(struct student)*10); 
      strcpy(array[i].name,token); 
      printf("%s %dn",array[i].name,i); 
      token = strtok(NULL, del); 
      array[i].course=malloc(sizeof(struct student)*11); 
      strcpy(array[i].course,token); 
      printf("%s n",array[i].course); 
      i=i+1; 
      token = strtok(NULL, del); 
      x=i; 
      for(x=0; x<i; x++) 
      { 
       if(strcmp(array[x].name,token)==0) 
        printf("Duplicate found n"); 
      } 
     } 
    } 
} 

Теперь, когда я пытаюсь сделать STRCMP, он всегда дает мне ошибку сегментации, и я не знаю, почему.

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

И у моего массива есть элементы в нем, я могу распечатать их все, просто не сравнивая их по какой-то причине.

+0

Вы уверены, что имя студента имеет длину всего 9 символов? – Alex

+1

. Повторно вставьте код с удаленными вкладками (настройте редактор, чтобы использовать только пробелы и повторный отступ). Также скомпилируйте свой код с включенными предупреждениями (для gcc '-Wall -Wextra') и посмотрите, есть ли у вас какие-либо подсказки от компилятора. – hyde

+0

Да, это часть части задания, что имя не будет длиннее 9 букв. –

ответ

2

Частичный ответ, указывая на то, что не имеет смысла. Вы должны попытаться понять, почему, поэтому вы можете их исправить. Но SO не является подходящим сайтом, чтобы объяснить, как работает что-то вроде malloc.


array[i].name=malloc(sizeof(struct student)*10); 
    strcpy(array[i].name,token); 

Вы выделить место для 10 student структур, а затем скопировать строку в него. Это бессмысленно. Поскольку name - char*, у вас должно быть malloc(<maximum size of string with terminating 0 included>).


array=malloc((init_size)*sizeof(int)); 

потом

array[i].name= ..... 

Вы выделяете array как массив целых чисел (обозначенных sizeof(int)), но затем использовать элементы, как если бы они были Структуры.


Тогда предложение: Каждый раз, когда у вас есть strcpy(dst, src), замените его следующим образом:

snprintf(dst, <how much space is allocated at dst>, "%s", src); 

Это позволит избежать переполнения буфера, и это также заставит вас подумать, сколько места вы выделили для dst (если вы не знаете, тогда ваша первая проблема будет решена и выйдет).

+2

Хотя хорошо указывать на конкретные места, он допустил ошибку, я думаю, что общим советам людей, интересующихся интро-курсами, является то, что они не должны писать строки кода, не думая о том, что они означают. Очень очевидно, что OP не знает, что делает 'malloc', или, по крайней мере, написал линию с другими намерениями. Если OP не может прочитать свой код, по-линии и фактически объяснить, что он должен делать, тогда нет смысла спрашивать «почему« strcmp »выдает segfault». – rliu

+0

@roliu Да. Я немного разъяснил ответ. Я написал в надежде заставить OP пойти и изучить эти вещи, чтобы он мог их исправить. – hyde

+0

Спасибо, ребята, все, что помогло, и я получил свою программу. :) –

1

Так как это очевидно (также вы сказали, что) токен равен нулю.

if(strcmp(array[x].name,token)==0) 

Это незаконно передать NULL параметр в strcmp.
Если функции сравнения строк вызывают с NULL в качестве одного параметра, процесс получит SIGSEGV,
, поскольку эти функции являются разыменовающими NULL-указателями.

+0

ya the strtok (NULL, del), перепутал меня, подумал, data = / –

Смежные вопросы