我可能错过了一些明显的东西,但是我的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