LWDL_string LWDL_getString(LWDL_Data data,LWDL_string list_name , LWDL_string value_name ){
int ret , o = 0 , b = 0;
LWDL_bool returned;
for (o=0;o<data.lwdl_data_size ;o++){
if ((ret = strcmp(data.list_array.array[o].list_name,list_name)) == 0){
for (b =0;b<data.list_array.array[o].list_values_name.used;b++){
if ((ret = strcmp(data.list_array.array[o].list_values_name.array[b],value_name)) == 0){
returned = LWDL_true;
return data.list_array.array[o].list_values.array[b];
}
}
}
}
if (returned == LWDL_false){
printf("return didn't succeed.nInfomation:nlistname : %snvalue_name : %s", list_name,value_name);
exit(-1);
}
}
图例:
LWDL_string = char*
LWDL_bool = int
LWDL_true = 1
LWDL_false = 0
我有这个函数,但当我把它投射到一个变量(如char(上时,它会给我一个分段错误*分段误差为:line 9: 14818 Segmentation fault (core dumped) ./a.out
return data.list_array.array[o].list_values.array[b];
看起来很复杂。几乎可以肯定的是,它有问题。哦,Haibrayn有一个很好的观点,当你声明returned
时,你没有将其设置为任何值,所以你在函数末尾的if
语句可能不会运行,它会返回给调用者,返回未设置的返回值。
使用调试器来确保一堆数据结构是您所认为的。调试器还将显示程序崩溃的确切位置。
如果你使用Ubuntu作为你的用户名,你可以在命令行用gdb运行这个程序。例如CCD_ 8。然后键入r
作为run,让它撕裂。那么好的命令是info local
和backtrace
或者仅仅是bt
。
如果你有一个程序崩溃,并且它不是在gdb下运行的,并且你在像Ubuntu 18或20这样的系统上,请查看命令行coredumpctl
程序。
我相信coredumpctl debug
会在你最后一个崩溃的程序上启动调试器。如果需要的话,还有更多的参数可以选择特定的崩溃转储。