Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C另一个存储器/Seg故障错误_C_Linux_Memory - Fatal编程技术网

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,试着在一个更大的盒子上调试你的程序。调试已经够痛苦的了,可以提供最好的环境了……无论如何,谢谢。但我发现了这个问题。基本上是一个打字错误。”