我正在使用指针:(。我尝试创建一个类似于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]说:无效的指针。
你能告诉我错误在哪里吗?我完全迷失了,任何帮助都会有用
答案 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“是这样的