Thread View: es.comp.os.linux.programacion
9 messages
9 total messages
Started by arrase
Sun, 04 Feb 2007 00:35
Problemas con punteros
Author: arrase
Date: Sun, 04 Feb 2007 00:35
Date: Sun, 04 Feb 2007 00:35
105 lines
3913 bytes
3913 bytes
No logro que este codigo adjunto funcione, si lo compilais tal cual
parece que todo va bien pero en realidad hay un overflow, en concreto la
primera vez que se ejecuta la linea *aux=strtok(NULL," "); se esta
escribiendo fuera de la memoria reservada, la manera mas facil de verlo
si teneis electric fence [1] instalado es compilarlo con:
gcc aux.c -lefence -ggdb -o aux
y correrlo en gdb, podreis ver esta salida:
Program received signal SIGSEGV, Segmentation fault.
0x0804864d in main () at aux.c:32
32 *aux=strtok(NULL," ");
El problema es que no se como reservar correctamente la memoria para que
sea un puntero que apunta a un array de tipo char, que basicamente es lo
que getopt necesita.
�Alguien me puede echar una mano?
Saludos.
[1] http://perens.com/FreeSoftware/
================= AUX.C =================
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <getopt.h>
struct module{
char **args;
};
struct node{
struct module *mod;
};
void print_r(struct module *mod);
void parse(int argc, char **argv);
int main(){
char str[]="-a aaaa -b bbbb";
char **aux;
struct node *nod;
nod=(struct node *)malloc(sizeof(struct node));
nod->mod=(struct module *)malloc(sizeof(struct module));
nod->mod->args=(char**)malloc(sizeof(char)*6);
aux=nod->mod->args;
*aux="asd";
aux++;
*aux=strtok(str," ");
while(*aux!=NULL){
aux++;
*aux=strtok(NULL," ");
}
print_r(nod->mod);
parse(5,nod->mod->args);
}
void print_r(struct module *mod){
char **aux;
aux=mod->args;
while(*aux!=NULL){
printf("%s\n",*aux);
aux++;
}
}
void parse(int argc, char **argv){
/* Store current commad line argument */
int next_opt=0;
/* Short options */
const char* const short_opt = "a:b:";
/* Long options */
const struct option long_opt[] =
{
{ "--A", 1, NULL, 'a' },
{ "--B", 1, NULL, 'b' },
/* End of long options */
{ NULL, 0, NULL, 0 }
};
/* Start parsing command line */
while(next_opt!=-1){
next_opt=getopt_long(argc, argv, short_opt, long_opt, NULL);
switch(next_opt){
case 'a':
puts(optarg);
break;
case 'b':
puts(optarg);
break;
};
}
}
--
<arrase@gulcas.org><http://arrase.no-ip.org><www.gulcas.org>
<Gnupg Keys: http://arrase.no-ip.org/pubkey.txt>
print "".join(map(lambda numChar:filter(lambda x:(x<"0") or \
(x>"9"),numChar),["0"+chr(104)+"0","1"+chr(111)+"1","2"+chr(108)+"2", \
"3"+chr(97)+"3","4"+chr(32)+"4","5"+chr(109)+"5","6"+chr(117)+"6", \
"7"+chr(110)+"7","8"+chr(100)+"8","9"+chr(111)+"9"]))
Re: Problemas con punteros
Author: Discreto
Date: Sun, 04 Feb 2007 06:08
Date: Sun, 04 Feb 2007 06:08
124 lines
4660 bytes
4660 bytes
Me parece que por aqui puede ser uno de los motivos.
Estas declarando a 'aux' como una matriz de dos dimensiones y en la
asignacion de memoria la dimensionas tomando como unidad de medida el
SIZE de un char, cuando deberia ser el SIZE de un puntero char:
> nod->mod->args=(char**)malloc(sizeof(char)*6);
nod->mod->args=(char**)malloc(sizeof(char*)*6);
Y ademas luego tienes que dimensionar cada uno de los elementos del
segundo subindice con un FOR y
nod->mod->args[n]=(char*)malloc(sizeof(char)*6);
Una forma de ver posibles soluciones es utilizar
http://www.google.com/codesearch donde es facil encontrar codigo similar
para tomarlo de ejemplo.
arrase escribió:
> No logro que este codigo adjunto funcione, si lo compilais tal cual
> parece que todo va bien pero en realidad hay un overflow, en concreto la
> primera vez que se ejecuta la linea *aux=strtok(NULL," "); se esta
> escribiendo fuera de la memoria reservada, la manera mas facil de verlo
> si teneis electric fence [1] instalado es compilarlo con:
>
> gcc aux.c -lefence -ggdb -o aux
>
> y correrlo en gdb, podreis ver esta salida:
>
> Program received signal SIGSEGV, Segmentation fault.
> 0x0804864d in main () at aux.c:32
> 32 *aux=strtok(NULL," ");
>
> El problema es que no se como reservar correctamente la memoria para que
> sea un puntero que apunta a un array de tipo char, que basicamente es lo
> que getopt necesita.
>
> ¿Alguien me puede echar una mano?
>
> Saludos.
>
> [1] http://perens.com/FreeSoftware/
>
> ================= AUX.C =================
>
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> #include <getopt.h>
>
> struct module{
> char **args;
> };
>
> struct node{
> struct module *mod;
> };
>
> void print_r(struct module *mod);
> void parse(int argc, char **argv);
>
> int main(){
> char str[]="-a aaaa -b bbbb";
> char **aux;
> struct node *nod;
>
> nod=(struct node *)malloc(sizeof(struct node));
> nod->mod=(struct module *)malloc(sizeof(struct module));
> nod->mod->args=(char**)malloc(sizeof(char)*6);
> aux=nod->mod->args;
> *aux="asd";
> aux++;
> *aux=strtok(str," ");
> while(*aux!=NULL){
> aux++;
> *aux=strtok(NULL," ");
> }
> print_r(nod->mod);
> parse(5,nod->mod->args);
> }
>
> void print_r(struct module *mod){
> char **aux;
> aux=mod->args;
> while(*aux!=NULL){
> printf("%s\n",*aux);
> aux++;
> }
> }
> void parse(int argc, char **argv){
> /* Store current commad line argument */
> int next_opt=0;
> /* Short options */
> const char* const short_opt = "a:b:";
> /* Long options */
> const struct option long_opt[] =
> {
> { "--A", 1, NULL, 'a' },
> { "--B", 1, NULL, 'b' },
> /* End of long options */
> { NULL, 0, NULL, 0 }
> };
> /* Start parsing command line */
> while(next_opt!=-1){
> next_opt=getopt_long(argc, argv, short_opt, long_opt, NULL);
> switch(next_opt){
> case 'a':
> puts(optarg);
> break;
> case 'b':
> puts(optarg);
> break;
> };
> }
> }
Re: Problemas con punteros
Author: Discreto
Date: Sun, 04 Feb 2007 06:10
Date: Sun, 04 Feb 2007 06:10
107 lines
4029 bytes
4029 bytes
A strtok no le puedes enviar como cadena principal un NULL, tiene que
ser una cadena valida.
arrase escribió:
> No logro que este codigo adjunto funcione, si lo compilais tal cual
> parece que todo va bien pero en realidad hay un overflow, en concreto la
> primera vez que se ejecuta la linea *aux=strtok(NULL," "); se esta
> escribiendo fuera de la memoria reservada, la manera mas facil de verlo
> si teneis electric fence [1] instalado es compilarlo con:
>
> gcc aux.c -lefence -ggdb -o aux
>
> y correrlo en gdb, podreis ver esta salida:
>
> Program received signal SIGSEGV, Segmentation fault.
> 0x0804864d in main () at aux.c:32
> 32 *aux=strtok(NULL," ");
>
> El problema es que no se como reservar correctamente la memoria para que
> sea un puntero que apunta a un array de tipo char, que basicamente es lo
> que getopt necesita.
>
> ¿Alguien me puede echar una mano?
>
> Saludos.
>
> [1] http://perens.com/FreeSoftware/
>
> ================= AUX.C =================
>
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> #include <getopt.h>
>
> struct module{
> char **args;
> };
>
> struct node{
> struct module *mod;
> };
>
> void print_r(struct module *mod);
> void parse(int argc, char **argv);
>
> int main(){
> char str[]="-a aaaa -b bbbb";
> char **aux;
> struct node *nod;
>
> nod=(struct node *)malloc(sizeof(struct node));
> nod->mod=(struct module *)malloc(sizeof(struct module));
> nod->mod->args=(char**)malloc(sizeof(char)*6);
> aux=nod->mod->args;
> *aux="asd";
> aux++;
> *aux=strtok(str," ");
> while(*aux!=NULL){
> aux++;
> *aux=strtok(NULL," ");
> }
> print_r(nod->mod);
> parse(5,nod->mod->args);
> }
>
> void print_r(struct module *mod){
> char **aux;
> aux=mod->args;
> while(*aux!=NULL){
> printf("%s\n",*aux);
> aux++;
> }
> }
> void parse(int argc, char **argv){
> /* Store current commad line argument */
> int next_opt=0;
> /* Short options */
> const char* const short_opt = "a:b:";
> /* Long options */
> const struct option long_opt[] =
> {
> { "--A", 1, NULL, 'a' },
> { "--B", 1, NULL, 'b' },
> /* End of long options */
> { NULL, 0, NULL, 0 }
> };
> /* Start parsing command line */
> while(next_opt!=-1){
> next_opt=getopt_long(argc, argv, short_opt, long_opt, NULL);
> switch(next_opt){
> case 'a':
> puts(optarg);
> break;
> case 'b':
> puts(optarg);
> break;
> };
> }
> }
Re: Problemas con punteros
Author: arrase
Date: Wed, 07 Feb 2007 20:21
Date: Wed, 07 Feb 2007 20:21
15 lines
1735 bytes
1735 bytes
Discreto escribi�:
>
> A strtok no le puedes enviar como cadena principal un NULL, tiene
> que ser una cadena valida.
No en la primera llamada, si en las siguientes, de hecho a de ser asi :)
--
<arrase@gulcas.org><http://arrase.no-ip.org><www.gulcas.org>
<Gnupg Keys: http://arrase.no-ip.org/pubkey.txt>
print "".join(map(lambda numChar:filter(lambda x:(x<"0") or \
(x>"9"),numChar),["0"+chr(104)+"0","1"+chr(111)+"1","2"+chr(108)+"2", \
"3"+chr(97)+"3","4"+chr(32)+"4","5"+chr(109)+"5","6"+chr(117)+"6", \
"7"+chr(110)+"7","8"+chr(100)+"8","9"+chr(111)+"9"]))
Re: Problemas con punteros
Author: arrase
Date: Wed, 07 Feb 2007 20:27
Date: Wed, 07 Feb 2007 20:27
37 lines
2636 bytes
2636 bytes
Discreto escribi�:
>
> Me parece que por aqui puede ser uno de los motivos.
>
> Estas declarando a 'aux' como una matriz de dos dimensiones y en la
> asignacion de memoria la dimensionas tomando como unidad de medida el
> SIZE de un char, cuando deberia ser el SIZE de un puntero char:
>> nod->mod->args=(char**)malloc(sizeof(char)*6);
>
> nod->mod->args=(char**)malloc(sizeof(char*)*6);
>
Cierto, ese era uno de los problemas, pero ha de ser una matriz de
punteros, es un vector de punteros de una dimension por lo que no hace
falta el for.
Ya he resuelto el problema, en el caso concreto del codigo del ultimo
mail creo que solo con solucionar lo del puntero ya esta, el problema
interesante surge cuando integras ese codigo en una aplicacion que ya ha
llamado a getopt con un argv y ahora lo intentas llamar otra vez con el
que has creado tu.
En ese caso tendras una violacion de segmento si no reseteas el valor de
la variables globales que usa getopt antes de volverlo a usar con tu
nuevo vector de argumentos.
Saludos.
--
<arrase@gulcas.org><http://arrase.no-ip.org><www.gulcas.org>
<Gnupg Keys: http://arrase.no-ip.org/pubkey.txt>
print "".join(map(lambda numChar:filter(lambda x:(x<"0") or \
(x>"9"),numChar),["0"+chr(104)+"0","1"+chr(111)+"1","2"+chr(108)+"2", \
"3"+chr(97)+"3","4"+chr(32)+"4","5"+chr(109)+"5","6"+chr(117)+"6", \
"7"+chr(110)+"7","8"+chr(100)+"8","9"+chr(111)+"9"]))
Re: Problemas con punteros
Author: arrase
Date: Wed, 07 Feb 2007 20:29
Date: Wed, 07 Feb 2007 20:29
14 lines
1715 bytes
1715 bytes
arrase escribi�:
....pero NO ha de ser una matriz de punteros, es un vector de punteros
de una dimension por lo que no hace falta el for.
--
<arrase@gulcas.org><http://arrase.no-ip.org><www.gulcas.org>
<Gnupg Keys: http://arrase.no-ip.org/pubkey.txt>
print "".join(map(lambda numChar:filter(lambda x:(x<"0") or \
(x>"9"),numChar),["0"+chr(104)+"0","1"+chr(111)+"1","2"+chr(108)+"2", \
"3"+chr(97)+"3","4"+chr(32)+"4","5"+chr(109)+"5","6"+chr(117)+"6", \
"7"+chr(110)+"7","8"+chr(100)+"8","9"+chr(111)+"9"]))
Re: Problemas con punteros
Author: Discreto
Date: Thu, 08 Feb 2007 00:34
Date: Thu, 08 Feb 2007 00:34
9 lines
1463 bytes
1463 bytes
arrase escribió: > arrase escribió: > ....pero NO ha de ser una matriz de punteros, es un vector de punteros > de una dimension por lo que no hace falta el for. > > > Gracias por todas tus aclaraciones, asi yo tambien aprendo.
Re: Problemas con punteros
Author: Claudio
Date: Thu, 08 Feb 2007 22:22
Date: Thu, 08 Feb 2007 22:22
11 lines
1341 bytes
1341 bytes
On 2007-02-04, arrase <arrase@gulcas.org> wrote: > El problema es que no se como reservar correctamente la memoria para que > sea un puntero que apunta a un array de tipo char, que basicamente es lo > que getopt necesita. Pues ser� como todo: malloc(sizeof(char *) * 6); Vamos, digo yo... Un saludo. --claudio--
Re: Problemas con punteros
Author: arrase
Date: Thu, 08 Feb 2007 23:41
Date: Thu, 08 Feb 2007 23:41
27 lines
1990 bytes
1990 bytes
Claudio escribi�:
> On 2007-02-04, arrase <arrase@gulcas.org> wrote:
>> El problema es que no se como reservar correctamente la memoria para que
>> sea un puntero que apunta a un array de tipo char, que basicamente es lo
>> que getopt necesita.
>
> Pues ser� como todo: malloc(sizeof(char *) * 6);
>
> Vamos, digo yo...
>
> Un saludo.
> --claudio--
>
>
Casi, te falta un peque�o matiz:
char **pointer2pointer=(char **)malloc(sizeof(char *) * 6);
--
<arrase@gulcas.org><http://arrase.no-ip.org><www.gulcas.org>
<Gnupg Keys: http://arrase.no-ip.org/pubkey.txt>
print "".join(map(lambda numChar:filter(lambda x:(x<"0") or \
(x>"9"),numChar),["0"+chr(104)+"0","1"+chr(111)+"1","2"+chr(108)+"2", \
"3"+chr(97)+"3","4"+chr(32)+"4","5"+chr(109)+"5","6"+chr(117)+"6", \
"7"+chr(110)+"7","8"+chr(100)+"8","9"+chr(111)+"9"]))
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads