我有一个指向已经通过以下方式分配内存的几个结构的指针:
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(如果你是那种东西)
答案 0 :(得分:0)
calloc()
分配struct
存储空间(STRUCTNAME*
),以便所有已分配的内存(即first
和second
)在开头为零。将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()
的内容。