C另一个存储器/Seg故障错误
[编辑:] 我现在已经删除了很多代码。我把它简化成一个更直截了当的问题 是否可以传递此变量C另一个存储器/Seg故障错误,c,linux,memory,C,Linux,Memory,[编辑:] 我现在已经删除了很多代码。我把它简化成一个更直截了当的问题 是否可以传递此变量 char Record_Info[file_length + 1]; 到另一个函数,如下所示: listdir(tempdesc, 0, sockid, Record_Info); 使用此标题的: int listdir(char *dirname, int lvl, int sockid, char Record_Info[]) listdir()可以多次调用其自身 *原始问题* 我想知道另一双
char Record_Info[file_length + 1];
到另一个函数,如下所示:
listdir(tempdesc, 0, sockid, Record_Info);
使用此标题的:
int listdir(char *dirname, int lvl, int sockid, char Record_Info[])
listdir()可以多次调用其自身
*原始问题*
我想知道另一双眼睛是否能看到这个。它正在工作,但我添加了更多的代码(可能更多的sprintf
,靠近底部),现在出现了分段错误
此程序正确地创建/发送网页,但当它从send\u recordings\u list()
函数返回到parsing\u request()函数时崩溃。我认为没有必要理解它是如何格式化文件中的数据的,但我还是包含了这一点
在大多数情况下,我使用的是静态变量,当我尝试free()
任何东西时,它会导致另一个seg错误,或gcc lib错误。另外,我不确定在函数()之间传递变量是否会导致此问题
同样值得一提的是,一个不同的函数(这里没有显示)发送一个大约4MB的网页,我可以多次调用这个函数,它不会崩溃。我在一些可能感兴趣的行中放置了一些/******
哦,是的,我还没有做太多的标准错误处理。。。(我稍后再做),所以假设它是真空中的球形鸡
因此,它从解析请求()开始
转到send\u recordings\u list()
转到listdir()
。(这多次称之为自我)
返回到send\u recordings\u list()
。(此处为seg故障)
返回到解析请求()
我希望有些人会说,‘啊,我知道你做了什么,傻瓜
。’
嵌入式Linux 2.6.27,GCC 4.2.4,32MB Ram
void parsing_request(int sockid, char *buff)
{
char *res_line=malloc(MAXLINE), path[MAXLINE], *line;
// Cut code
if (strcmp(line, "/recordings_body.htm") == 0)
{
send_recordings_list (sockid); // ****** IT GOES HERE 1st ******
return;
}
free (res_line);
return;
}
int send_recordings_list(int sockid)
{
int hnd;
int hnd2;
char tempdesc[MAX_PATH_LENGTH];
// Copy all of the data <1 MiB (Slow reading)
int file_length = lseek (hnd2, 0, SEEK_END);
char Record_Info[file_length + 1]; // ******
lseek (hnd2, 0, SEEK_SET);
read (hnd2, Record_Info, file_length);
close (hnd2);
// Cut out code
del_file_cnt = 0;
sprintf (tempdesc, "%s/Recordings", TOPPY_DIR);
listdir(tempdesc, 0, sockid, Record_Info); // ***** Major 2nd call here
return 0;
}
int listdir(char *dirname, int lvl, int sockid, char Record_Info[])
{
int i;
DIR* d_fh;
struct dirent* entry;
char longest_name[4096];
char tempdesc[4096], morespace[128];
int row_col;
char chan_name[128], alt_name[128], desc[500], category[128], rec_time[14], start_time[14], end_time[14];
char trim_file_name[128], trim_file_name2[128], trim_alt_name[128], file_links[1535];
char logo[128];
int length, u_score, dot;
char *looky_pos1, *looky_pos2;
int is_match;
struct tm tm_rec, tm_start, tm_end;
time_t tim_rec, tim_start, tim_end;
// Cut out code
return 0;
}
void解析请求(int-sockid,char*buff)
{
char*res_line=malloc(MAXLINE),路径[MAXLINE],*line;
//剪切代码
if(strcmp(行,“/recordings\u body.htm”)==0)
{
发送录制列表(sockid);//*******它先到这里******
返回;
}
免费(res_线);
返回;
}
int发送记录列表(int sockid)
{
int hnd;
int-hnd2;
char tempdesc[最大路径长度];
//复制所有数据抱歉,这是一个毫无希望的混乱。学习如何使用Linux工具,如valgrind和gdb。仔细检查您请求的内存是否在使用完毕后最终被释放。检查您是否没有将指向局部变量的指针从函数中传递出去。检查您的字符串是否足够长,以容纳预期的数据d(或者作为您的as-now不存在的错误处理的一部分进行检查)
泰迪熊顾问是一种非常有效的调试策略:找一只泰迪熊,一步一步地向它解释你的问题。只有在这没有帮助的情况下,一个真正的人类才有理由这样做。[这是有效的,因为整理你的理解来解释它迫使你真正地思考它。]快速查看代码后,您有两个选择:
了解如何处理错误、如何管理资源以及如何避免全局变量
使用适合您的编程语言
这两种方法都需要很长时间,但使用第二种方法,您的工作效率会更高
我建议尝试用Python实现上述功能,只是为了获得一种感觉。回答您最近的帖子,询问您是否可以将字符值传递到函数中……我不明白您想做什么。在函数原型中,您将最后一个参数作为char变量\u name[],是否尝试传入数组?如果是,为什么不使用指针
因此,原型希望:
int listdir(char *dirname, int lvl, int sockid, char* Record_Info);
通过引用传递总是倾向于给您多一点控制权,不管您是否想要。您是否尝试传入数组的特定元素?问题中的代码太多了。请将其精简到您认为涉及的特定位。“我稍后将添加错误处理”从未成功过。错误处理必须是整个体系结构的一部分。好吧。这不是一个用于代码审查的网站,而是一个用于具体技术问题的网站。请解决您的问题,直到您能够提出一个结构良好的问题。投票关闭。对于网络代码:使用returnvalue from read(),write()send()recv())字符串[strlen(string)-4]
是非常可疑的。strcat()的过度使用也是如此。@auselen,sprintf仍然有效。甚至是标准的一部分。是的,你必须小心使用它。还记得C框上用红色大字写的是什么吗?“小心!里面有非常尖锐的物体。不要让孩子们来处理。”“检查一下,不要把指向局部变量的指针传递到函数外。”“,嗯,好吧,我最好检查一下,谢谢。不幸的是,valgrind没有处理这个小盒子,但我会研究gdb。泰迪熊:)@Matt,试着在一个更大的盒子上调试你的程序。调试已经够痛苦的了,可以提供最好的环境了……无论如何,谢谢。但我发现了这个问题。基本上是一个打字错误。”