处理动态矩阵中的指针的问题

时间:2010-12-06 19:55:05

标签: c pointers memory-management

我正在使用指针:(。我尝试创建一个类似于argv返回的函数。我的意思是,我希望它将一个顺序划分为一些字符串,每个字符串按顺序指向不同的指针通过方括号引用它们(即:order [0],order [1])。

我想为任意数量的单词做这些,所以我使用dinamic内存。为了划分我使用strtok的顺序,它正常工作。问题是处理指针:

在结果**中,我使用realloc为指向每个单词的指针保留内存,因此,有令牌时我会执行以下操作:

  • 我增加了结果的大小
  • 我为指向
  • 的指针保留了内存
  • 我签署了令牌

(停止降价促销的文字)

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
    char linea[] = "send UDP 4500 50";
    char **resul=NULL;
    int numTokens,conta2;
    char *sep=" ";//character which divides the orders
    int conta=0;  //counter of the number of tokens found
    char *saveptr,*token;

    for(token=strtok_r(linea,sep,&saveptr); token!=NULL; token=strtok_r(NULL,sep,&saveptr)){
        printf("token: %s\n",token);
        printf("size: %i\n",(conta+1)*sizeof(char*));
        resul = (char **)realloc(resul,(conta+1)*sizeof(char*)); //Increase the size for the array of pointers

        resul[conta]= malloc(sizeof(char*)); //Reserve size for the pointer
        resul[conta]=token; //Asign word to the pointer
        conta++;
    }
    //Print the results
    for(conta2=0;conta2<conta;conta2++)
        printf("resul: \"%s\"\n",resul[conta2]);
    //free memory
    for(conta2=0;conta2<conta;conta2++){
        printf("liberando: %i\n",conta2);
        free(resul[conta2]);
    }
    free(resul);
    return(0);
}

输出结果为:

$ ./lectura_consola 
token: send
size: 4
token: UDP
size: 8
token: 4500
size: 12
token: 50
size: 16
resul: "send"
resul: "UDP"
resul: "4500"
resul: "50"
liberando: 0
*** glibc detected *** ./lectura_consola: free(): invalid pointer: 0xbffb7f1b ***

如果我用valgrind运行它以查看内存中的故障,那么在free(结果[0])步骤中会发生:

liberando: 0
==8372== Invalid free() / delete / delete[]
==8372==    at 0x40257ED: free (vg_replace_malloc.c:366)
==8372==    by 0x80489FA: main (lectura_consola.c:92)
==8372==  Address 0xbee8e28b is on thread 1's stack

使用此代码,程序可以正确保存和打印单词,但在释放内存的那一刻,它会进行解析,当它试图释放结果时[0]说:无效的指针。

你能告诉我错误在哪里吗?我完全迷失了,任何帮助都会有用

2 个答案:

答案 0 :(得分:2)

这里的问题是你试图释放你没有分配的内存。你在第一个循环中有这个代码:

resul[conta]= malloc(sizeof(char*)); //Reserve size for the pointer
resul[conta]=token; //Asign word to the pointer

第二个语句会覆盖第一个语句的结果,这样当你调用free(resul[conta])时,你试图释放token(这是一个指向字符串的指针)而不是指针你分配了。

在任何情况下,您都不需要第一个声明。您的realloc调用会为一系列指针保留空间。对malloc的调用只是将sizeof(char*)个字节分配给没有好的效果(即浪费内存)。而且由于这个值只是被覆盖了,你最终会泄漏那个记忆。

只需删除对malloc的调用,您的代码即可运行。

答案 1 :(得分:0)

据我记得strtok不分配内存只是insterts \ 0之间的令牌,这意味着你免费只读代码内存 - 发送UDP 4500 50“是这样的