void函数返回时的总线错误

时间:2014-08-05 22:07:11

标签: c libcurl bus-error

我正在学习在C中使用libcurl。首先,我使用一个随机的入藏名单列表来搜索可能被托管here的蛋白质序列文件。这些遵循一种设置格式,其中第一行是可变长度(但不包含我正在尝试查询的信息),然后是一系列大写字母,每六十(60)个字符有一个新行(我想要下拉,但每行重新格式化为八十(80)个字符。)

我将呼叫本身放在一个功能中:

//finds and saves the fastas for each protein (assuming on exists)
void pullFasta (proteinEntry *entry, char matchType, FILE *outFile) {
    //Local variables
    URL_FILE *handle;
    char buffer[2] = "", url[32] = "http://www.uniprot.org/uniprot/", sequence[2] = "";

    //Build full URL
    /*printf ("u:%s\nt:%s\n", url, entry->title); /*This line was used for debugging.*/
    strcat (url, entry->title);
    strcat (url, ".fasta");

    //Open URL
    /*printf ("u:%s\n", url); /*This line was used for debugging.*/
    handle = url_fopen (url, "r");

    //If there is data there
    if (handle != NULL) {
        //Skip the first line as it's got useless info
        do {
            url_fread(buffer, 1, 1, handle);
        } while (buffer[0] != '\n');

        //Grab the fasta data, skipping newline characters
        while (!url_feof (handle)) {
            url_fread(buffer, 1, 1, handle);
            if (buffer[0] != '\n') {
                strcat (sequence, buffer);
            }
        }

        //Print it
        printFastaEntry (entry->title, sequence, matchType, outFile);
    }
    url_fclose (handle);
    return;
}

proteinEntry定义为:

//Entry for fasta formatable data
typedef struct proteinEntry {
    char title[7];
    struct proteinEntry *next;
} proteinEntry;

找到url_fopenurl_fcloseurl_feofurl_readURL_FILE代码here,它们模仿了哪些文件函数他们被命名。

正如您所看到的,我一直在使用URL生成器进行一些调试(uniprot URL遵循不同蛋白质的相同格式),我使其正常工作并可以从站点下载数据并将其保存到文件中我想要的正确格式。我将读缓冲区设置为1,因为我想在开始玩游戏之前得到一个非常简单但功能强大(如果不优雅)的程序,所以我会有一个基础来回到我学到的东西。

我已经测试了url_<function>次来电,他们没有给出任何错误。所以我在每一行之后添加了增量printf调用,以确定发生总线错误的确切位置,并且发生在return;

我对总线错误的理解是,这是一个内存访问问题,我试图获取内存,我的程序无法控制。我的困惑来自于return void函数的url_fclose (NULL)发生的事实。没有任何东西被读取,写入或传递以触发内存错误(据我所知,至少)。

有人能指出我正确的方向来解决我的错误吗?

编辑:@BLUEPIXY指出我有潜在的sequence。正如@deltheil指出的那样,我有url作为静态数组。这也让我注意到我正在为{{1}}重复我的错误内存分配,所以我更新了它,它现在有效。谢谢你的帮助!

1 个答案:

答案 0 :(得分:3)

如果我们查看例如http://www.uniprot.org/uniprot/Q6GZX1.fasta并跳过第一行(就像你一样),我们有:

MNAKYDTDQGVGRMLFLGTIGLAVVVGGLMAYGYYYDGKTPSSGTSFHTASPSFSSRYRY

这是一个60个字符的字符串。

当您尝试使用以下内容阅读此序列时

//Grab the fasta data, skipping newline characters
while (!url_feof (handle)) {
    url_fread(buffer, 1, 1, handle);
    if (buffer[0] != '\n') {
        strcat (sequence, buffer);
    }
}

问题是sequence 不可扩展不够大(它是大小为2的固定长度数组

因此,请确保选择足够大的尺寸来容纳任何序列,或者实现在运行中扩展它的能力。