gpt4 book ai didi

c - Malloc 和 free 错误

转载 作者:行者123 更新时间:2023-11-30 17:44:31 24 4
gpt4 key购买 nike

在下面的函数中,我解析链接列表中的字符串并向结构数组赋予值。有什么方法可以让我不在 while 循环内使用 malloc。我无法处理 glibc 错误,因此寻找其他方法。我尝试使用 char 数组而不是 char* 作为结构字段。但我收到段错误。实际上该函数是有效的,但我必须在 15000 次之后调用该函数,所以我想确保这次不会造成任何内存问题。

struct CoordNode
{
int resNum;
double coordX;
double coordY;
double coordZ;
char atomName[4];
};
void parseCrdList()
{
int resNum=1;
int tAtomNum,i;
char *tcoordX, *tcoordY, *tcoordZ, *tatomName, tresNum[5];
ccur_node=headCoord_node->next;
struct CoordNode *t;
t=malloc(numofRes*sizeof(struct CoordNode));
i=0;
while (ccur_node!=NULL)
{
tresNum=malloc(5*sizeof(char));
memcpy(tresNum,ccur_node->crdRow+26,4);
resNum=atoi(tresNum);
t[i].resNum=resNum;
tcoordX=malloc(8*sizeof(char));
memcpy(tcoordX,ccur_node->crdRow+35,7);
tcoordY=malloc(8*sizeof(char));
memcpy(tcoordY,ccur_node->crdRow+43,7);
tcoordZ=malloc(8*sizeof(char));
memcpy(tcoordZ,ccur_node->crdRow+51,7);
t[i].coordX=strtod(tcoordX,NULL);
t[i].coordY=strtod(tcoordY,NULL);
t[i].coordZ=strtod(tcoordZ,NULL);
tatomName=malloc(4*sizeof(char));
memcpy(tatomName,ccur_node->crdRow+17,3);
strcpy(t[i].atomName,tatomName);
old_ccur_node=ccur_node;
ccur_node=ccur_node->next;
//free(old_ccur_node);
i++;
}
numofRes=i;
addCoordData(t);
//free(t);
t=NULL;
}

最佳答案

一些想法和猜测。
首先,正如我之前提到的,在 C 中 sizeof(char) 始终是 1 byte,它实际上是 C 中的标准字节定义。因此,删除那些完全不必要且难以阅读的内容.

回到主要问题。
您永远不会使用大于 8 的字符数组,因此只需将其静态设置为 8 个字节长即可。如果您必须调用函数 15k 次,这将为您节省大量时间(malloc 需要时间为您分配内存)。

根据问题中的信息,我猜您的段错误是未初始化使用 malloc 分配的内存或为其声明为 auto char [8] 保留的内存的原因
1. 您分配(或第二个版本 - 声明 8 字节数组)8 个字节。效果很好。但这里你得到的 8 个字节都是垃圾。

2. 您从列表中复制了 7 个字节。这也很好。但是您忘记了 NULL 终止,因此如果您尝试将其打印回来,则会出现段错误。编辑如果它有效,那么您可能很幸运,因为它不应该。

解决方案
替换char *巫师char [8],删除所有与这些char *对应的mallocfreenull 终止 strcpystrncpymemcpy 之后的所有 char[8] (无论您的选择是什么,取决于您对列表中的数据正确性的信心)向他们提供数据。

在进一步使用之前也使用 valgrind 检查您的代码。

关于c - Malloc 和 free 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19966971/

24 4 0
文章推荐: c - 使用不同的参数运行不同的函数 - 函数指针
文章推荐: javascript - 如何在 Node.JS 中处理地名城市数据
文章推荐: javascript - 使用 jQuery 在