gpt4 book ai didi

c - 释放指针引用的结构中的指针

转载 作者:太空宇宙 更新时间:2023-11-04 00:06:52 24 4
gpt4 key购买 nike

我有一个指向几个已通过以下方式分配内存的结构的指针:

STRUCTNAME *ptr;
ptr = (STRUCTNAME *)malloc(sizeof(STRUCTNAME)*numberOfStructs);

结构是通过这样的偏移量访问的:

(ptr + i)->field;

该结构有 2 个字段,它们是字符指针,如下所示:

typedef struct
{
char *first;
char *second;
}STUCTNAME;

这些字段分配的内存如下:

(ptr + i)->first = (char *)malloc(strlen(buffer));

这似乎可行,但是当我尝试释放结构中的指针时,我在执行此操作时遇到了段错误 11:

free((prt + i)->first);

帮忙吗?

注意事项:缓冲区是一个字符数组。用一个整数偏移一个指针应该增加指针的大小乘以它指向的整数是否正确?

这是我的完整源代码的链接。我还没有编写一些函数,我还没有使用 freeAllpointers 和 printAll。 https://drive.google.com/file/d/0B6UPDg-HHAHfdjhUSU95aEVBb0U/edit?usp=sharing

哦!感谢大家!感恩节快乐! =D(如果你喜欢那种东西)

最佳答案

  • 如果您没有初始化那段代码中的所有这些成员,您就不会向我们展示:
    使用 calloc() 分配 struct 存储 (STRUCTNAME*) ,所以所有分配的内存,即 firstsecond 在开始时都是零。将 NULL 传递给 free()将导致空操作。将任何野(垃圾)指针传递给 free() 可能会导致段错误。
  • 要检测双重释放,在 free(ptr[i].first); 之后设置 ptr[i].first = NULL; 作为防御措施测试。

Notes: buffer is a character array. Offsetting a pointer by a integer should increment the pointer by the size of what it is pointing to times the integer correct?

是的,除了那些编译器上的 void*,它们没有定义 sizeof(void),它被定义为具有未定义的行为,值为 > 0 : What is the size of void?

编辑:

void makeReviews(FILE *input, REVIEW *rPtr, int numReviews) <-- 这不会返回 rPtr 的新值。在 main() 中,它将保持为 NULL。做这样的事情:

REVIEW* makeReviews(FILE *input, int numReviews);
//...
int main(){
//...
rPtr = makeReviews(input,numReviews);
//...
}

void makeReviews(FILE** input,REVIEW** rPtrPtr,int numReviews){
REVIEW* rPtr = *rPtrPtr;
//...
*rPtrPtr = rPtr;
}
//...
int main(){
//...
makeReviews(input,&rPtr,numReviews);
//...
}

fgets(cNumReviews, sizeof(cNumReviews), input); <-- 也许,你可以使用类似 fscanf() 的东西.

关于c - 释放指针引用的结构中的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20273127/

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