gpt4 book ai didi

c - 无效函数返回时的总线错误

转载 作者:太空宇宙 更新时间:2023-11-04 02:02:37 25 4
gpt4 key购买 nike

我正在学习在 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_fopen , url_fclose , url_feof , url_read , 和 URL_FILE找到代码 here , 它们模仿它们被命名的文件功能。

如您所见,我一直在使用 URL 生成器进行一些调试(uniprot URL 对不同的蛋白质遵循相同的格式),我让它正常工作并且可以从站点提取数据并将其保存到文件中我想要的正确格式。我将读取缓冲区设置为 1,因为我想在开始玩东西之前获得一个非常简单但实用(如果不优雅)的程序,这样我就可以在学习时返回一个基础。

我测试了 url_<function>电话,他们没有给出任何错误。所以我添加了增量 printf在每一行之后调用以准确识别总线错误发生的位置,它发生在 return;。 .

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

谁能指出正确的方向来纠正我的错误?

编辑:正如@BLUEPIXY 指出的那样,我有潜力 url_fclose (NULL) .正如@deltheil 指出的那样,我有 sequence作为静态数组。这也让我注意到我正在为 url 重复错误的内存分配。 ,所以我更新了它,它现在可以工作了。感谢您的帮助!

最佳答案

如果我们查看例如 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 的固定长度数组)。

因此,请确保选择足够大的大小来容纳任何序列,或者实现动态扩展它的能力。

关于c - 无效函数返回时的总线错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25149140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com