2017-11-04 98 views
1

我正在写一个函数从文件中获取文本,当我尝试释放一些calloc'd内存时遇到问题。释放calloc'd内存时出现错误:释放无效下一个大小(快)

ye. wee.\n 

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

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

我已经检查了gdb中的程序,当它碰到空闲(键)时,它会导致段错误,并带有以下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 

我还不熟悉使用内存分配,所以这让我感到困惑。

+0

我认为for for循环是不正确的...您为键分配三个字符,并且您将3个字符从定义复制到其中。所以,密钥不会被终止。您需要分配一个额外的字符来保存空终止符。 – bruceg

回答

2

当第一次评估defn[i-x] = definition[i];时,x的值为i+1,所以i-x为-1。

+0

'我 - (i + 1)'肯定是-1 – bruceg

+0

是的。这对我来说非常尴尬。作为一个混乱控制的问题,我是否应该删除这个问题,因为它不太可能有人会觉得这很有用? –

+0

我会离开它,因为也许有人会犯类似的错误 – bruceg