【问题标题】:Error when freeing calloc'd memory: free invalid next size (fast)释放 calloc'd 内存时出错:释放无效的下一个大小(快速)
【发布时间】:2017-11-04 04:26:46
【问题描述】:

我正在编写一个函数来从文件中获取文本,当我尝试释放一些被调用的内存时遇到了问题。

ye. wee.\n

当传递带有上述内容的txt文件时,该函数为ye的3个char字符分配内存。并将它们复制进去。然后为其他 6 个字符分配内存并将它们复制进去。然后打印相应的字符串并释放内存。

testFor() 是一个函数,它返回第一个'.'的索引。在一个字符串中。

我已经检查了 gdb 中的程序,当它点击 free(key) 时,它会导致以下error 的段错误(抱歉,还不能嵌入图像)。

//more above    
while ((fgets(line, 256, source_fp)) != NULL) {
            if (line[0] == '\n') {
                if (pflag) {
                    int first = testFor(definition);
                    int second = strlen(definition);
                    printf("%d %d\n", first, second);
                    key = calloc(first + 1, sizeof(char));
                    defn = calloc((second - (first + 1)), sizeof(char));
                    for (i = 0; i < (first + 1); i++) {
                        key[i] = definition[i];
                        }
                    int x = i + 1;
                    for (; i < second; i++) {
                        defn[i-x] = definition[i];
                        }
                    printf(">%s<\n", key);
                    printf(">%s<\n", defn);
                    free(key);
                    free(defn);
                    }
                    //more

我对使用内存分配还很陌生,所以这让我很困惑。

【问题讨论】:

  • 我认为 for for 循环不正确...您为键分配了三个字符,然后将定义中的 3 个字符复制到其中。因此,密钥不会以空值终止。您需要分配一个额外的字符来保存空终止符。

标签: c free calloc


【解决方案1】:

defn[i-x] = definition[i];第一次被求值时,x的值是i+1,所以i-x是-1。

【讨论】:

  • i - (i + 1) 肯定是-1
  • 是的。这对我来说很尴尬。作为杂乱控制的问题,我是否应该删除这个问题,因为它不太可能有人会觉得这很有用?
  • 我会留下它,因为也许有人会犯类似的错误
猜你喜欢
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
  • 2012-05-22
  • 2016-03-02
  • 1970-01-01
相关资源
最近更新 更多