2016-03-15 89 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