【问题标题】:Freeing a pointer in a structure referenced by a pointer释放指针引用的结构中的指针
【发布时间】:2013-11-28 18:55:54
【问题描述】:

我有一个指向多个结构的指针,这些结构通过以下方式分配了内存:

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(如果你喜欢那种东西)

【问题讨论】:

  • 但无论如何,您不应该释放指向数组各个成员的指针。指针只有在malloc()ated(或calloc()ated 或realloc()ated)时才为free()d,它只是指向第一个元素的指针。跨度>
  • ptr[i].first 怎么样?看起来好多了。
  • 在释放 char 指针之前是否释放了结构指针? ;)
  • (char *)malloc(strlen(buffer)); 是可疑的。之后你复制了bufferstrcpy 吗?如果你是的话,你就是在浪费内存——因为没有空间给 nul 终止符。使用malloc(strlen(buffer)+1)

标签: c


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

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

是的,除了那些编译器上的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() 的东西。

【讨论】:

  • 我相信 fgets 工作正常,因为当我打印 makeReviews 中的字段值时,输出符合预期。我将尝试使用 makeReviews 的返回类型执行您所说的操作。再次感谢。
  • @Mac:不客气。我建议fscanf() 作为一种可能的捷径,而不是作为一种修复。
  • 哇,显然我不明白通过引用传递指针?那成功了。非常感谢朋友。
  • 不客气。您不能在 C 中通过引用传递。您可以做的是将指针传递给指针(请参阅编辑)。
  • 哦,是的,我明白你对fscanf() 的意思。我误会了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多