c-当我在一个变量(如char*)上输入返回类型时,为什么这个函数会给我一个分段错误


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 localbacktrace或者仅仅是bt

如果你有一个程序崩溃,并且它不是在gdb下运行的,并且你在像Ubuntu 18或20这样的系统上,请查看命令行coredumpctl程序。

我相信coredumpctl debug会在你最后一个崩溃的程序上启动调试器。如果需要的话,还有更多的参数可以选择特定的崩溃转储。

相关内容

最新更新