2016-03-15 3 views
-1

У меня проблема с массивом в массиве структур. Моя проблема заключается в том, что сразу после назначения массива данные читаемы без проблем, но через некоторое время я получаю неправильные результаты. вот мой код:Ошибка доступа к памяти C

struct time_on_off { 
    struct tm time_on; 
    struct tm time_off; 
}; 

struct device { 
    int mysqlid; 
    int port; 
    char name[12]; 
    struct tm time_on; 
    struct tm time_off; 
    struct time_on_off *time_on_off; 
    int automatic; 
    int state; 
    struct tm timer; 
    int man; 
    int numtimers; 
}; 

struct device devices[8]; 
char sqlquery[150]; 


int update(){ 

    MYSQL_RES *res; 
    MYSQL_ROW row; 

    day=currenttime->tm_wday; 
    day=(day==0)?7:day; 

    printf("Updating ... %d \n", day); 
    res=connectsql("SELECT * FROM `devices` AS A INNER JOIN manual AS B ON A.id = B.id"); 

    for (int i=0;(row = mysql_fetch_row(res)) != NULL;i++) { 

     devices[i].mysqlid=atoi(row[0]); 
     devices[i].port=atoi(row[3]); 
     devices[i].automatic=1; 
     devices[i].man=0; 
     devices[i].timer.tm_min=0; 
     devices[i].timer.tm_hour=0; 
     strcpy(devices[i].name,row[1]); 
     devices[i].state=atoi(row[5]); 
     devices[i].numtimers=0; 

     if(row[7]!=NULL){ 

     strptime(row[7],"%H:%M:%S", &devices[i].timer); 
     devices[i].automatic=0; 
     devices[i].man=atoi(row[6]); 

     } 
    } 

    mysql_close(conn); 

    for (int i=0; i<(sizeof(devices)/sizeof(struct device)); i++){ 

    sprintf(sqlquery,"SELECT * FROM `timer` WHERE `dayid` = '%i' AND `deviceid` = '%i'",day,devices[i].mysqlid); 
    res=connectsql(sqlquery); 

    for (int o=0;(row = mysql_fetch_row(res))!= NULL;o++) { 

     devices[i].time_on_off = (struct time_on_off *) realloc(devices[i].time_on_off, devices[i].numtimers+1); 
     strptime(row[2],"%H:%M:%S", &devices[i].time_on_off[o].time_on); 
     strptime(row[3],"%H:%M:%S", &devices[i].time_on_off[o].time_off); 
     printf("On: %i:%i \n", devices[i].time_on_off[o].time_on.tm_hour,devices[i].time_on_off[o].time_on.tm_min); 
     printf("Off: %i:%i \n", devices[i].time_on_off[o].time_off.tm_hour,devices[i].time_on_off[o].time_off.tm_min); 
    devices[i].numtimers++; 
    devices[i].automatic=1; 

    } 
    mysql_close(conn); 
    } 

    for (int i=0; i<(sizeof(devices)/sizeof(struct device)); i++){ 

     printf("Name: %s \n", devices[i].name); 
     printf("Port: %i \n", devices[i].port); 
     printf("Automatic: %i \n", devices[i].automatic); 
     printf("man: %i \n", devices[i].man); 
     printf("Timer: %i:%i \n", devices[i].timer.tm_hour,devices[i].timer.tm_min); 

     for (int o=0; o<devices[i].numtimers; o++){ 

      printf("On: %i:%i \n", devices[i].time_on_off[o].time_on.tm_hour,devices[i].time_on_off[o].time_on.tm_min); 
      printf("Off: %i:%i \n", devices[i].time_on_off[o].time_off.tm_hour,devices[i].time_on_off[o].time_off.tm_min); 
     } 
    } 
return 0; 
} 

выход:

Updating ... 2 
On: 14:0 
Off: 16:0 <- thats the correct value 
On: 16:0 
Off: 18:0 
On: 17:0 
Off: 19:0 
On: 15:8 
Off: 16:9 
Name: Poolpumpe 
Port: 0 
Automatic: 1 
man: 0 
Timer: 0:0 
On: 14:0 
Off: 1936681068:1633906540 <- here seems to be the error 
Name: Poollicht 
Port: 1 
... 

Кто-нибудь есть идея для меня? Спасибо

+2

Могу сказать, что я не вижу, где ваша функция начинается и заканчивается. Это просто большой беспорядок линий. Далее ... –

+1

Приложите больше усилий в свои вопросы, в данном случае: форматирование. Это трудно прочитать из-за неправильного отступа, и я уверен, что многие люди видят это и даже не удосуживаются прочитать его из-за этого. Поэтому в ваших собственных интересах правильно форматировать. Кроме того, вы прошли через свой код с помощью отладчика, чтобы проанализировать его? – DarkDust

+0

Я попытался его очистить. Спасибо за ваш совет. – user154501

ответ

1

Ваш (пере) распределение является неправильным, вы не выделить место для x записей, вы только выделить x байт:

devices[i].time_on_off = realloc(devices[i].time_on_off, devices[i].numtimers+1); 

Ваше намерение здесь, вероятно, чтобы иметь достаточно места для o+1 записей (o == devices[i].numtimers в твоем случае). Так что это должно быть что-то вроде:

devices[i].time_on_off = realloc(devices[i].time_on_off, sizeof(struct time_on_off) * (o+1)); 

или:

devices[i].numtimers++; 
devices[i].time_on_off = realloc(devices[i].time_on_off, sizeof(struct time_on_off) * devices[i].numtimers); 

Кроме того, don't cast the result pointer from malloc and realloc.

+0

Спасибо, он работает сейчас, как и ожидалось. – user154501

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