我可能錯過了一些明顯的東西,但是我的C很生疏,我沒有任何運氣能夠理解這一點。我有一個循環,我想遍歷來自libdvdnav的uint64_t
值的數組,然後格式化值並將它們插入到字符串中。通過指向數組的指針取消引用數組值
爲libdvdnav頭定義函數我打電話正是如此:
uint32_t dvdnav_describe_title_chapters(dvdnav_t *self, int32_t title, uint64_t **times, uint64_t *duration);
這裏是我如何定義使用的變量,並在呼叫(dvdnav
和args[0]
了定義並初始化其他地方):
uint64_t *times;
uint64_t duration;
uint32_t times_array_len;
times_array_len = dvdnav_describe_title_chapters(dvdnav, atoi(args[0]), ×, &duration);
下面的代碼似乎工作,並編譯&運行的w/o錯誤,但當然只是陣列中的第一個值被插入:
int i = 0;
uint64_t a_time = times[0];
while(i < times_array_len){
char time_json[100];
sprintf(time_json, "{\"chapter\":\"%d\",\"time\":\"%u\"},", i, a_time);
strcat(payload, time_json);
i++;
}
如果我修改此選擇它仍然編譯乾淨的陣列中的每個值,但在運行時拋出一個段錯誤:
int i = 0;
while(i < times_array_len){
char time_json[100];
sprintf(time_json, "{\"chapter\":\"%d\",\"time\":\"%u\"},", i, times[i]);
strcat(payload, time_json);
i++;
}
我想也許有什麼東西在,這是數組元素之一一個問題(一個太大的值,意外的,NULL等),但即使我用一個已知合理的元素(比如0
)替換變量i
它仍然存在段錯誤。我確信在這裏會有無數其他的改進(比如更安全的分配,溢出保護等等),但我努力破譯的部分是將這些值從數組中取出並存入我的格式化字符串中。
「在運行時會引發段錯誤」 - 在哪裏?啓動一個調試器。 – 2014-10-29 15:19:59
'strcat()'調用看起來很可怕... – unwind 2014-10-29 15:20:38
有2個可能的問題。首先,你在計算'times_array_len'時會出現一些錯誤,'times'就會小些。其次,您的負載太短,無法保存所有這些數據。 – 2014-10-29 15:21:15