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

时间:2013-11-28 18:55:55

标签: c

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

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);

帮助?

注意: buffer是一个字符数组。用整数偏移指针应该将指针的大小增加到整数正确的倍数吗?

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

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

1 个答案:

答案 0 :(得分:0)

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

注意:buffer是一个字符数组。用整数偏移指针   应该将指针增加指向它的大小   乘以整数正确吗?

是的,除了那些没有定义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()的内容。