🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.os.linux.programacion
Article #660

Re: Problemas con punteros

#660
From: Discreto
Date: Sun, 04 Feb 2007 06:08
124 lines
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;
>         };
>     }
> }
Technical Details
Message-ID: <lLexh.10414$vZ.7278@fe167.usenetserver.com>
Path: arc1-ca.pugleaf.net!g2news2.google.com!news3.google.com!border1.nntp.dca.giganews.com!nntp.giganews.com!wns14feed!worldnet.att.net!208.49.83.146!uns-out.usenetserver.com!news.usenetserver.com!pc02.usenetserver.com!fe167.usenetserver.com.POSTED!232df425!not-for-mail
References: <eq39a9$g7h$1@hercules.cohp1>

Show Full Headers
Complete Article Headers
X-Google-Thread: f86c8,97b70f2db46c0da6
X-Google-Attributes: gidf86c8,public
X-Google-Language: SPANISH,ASCII
Path: arc1-ca.pugleaf.net!g2news2.google.com!news3.google.com!border1.nntp.dca.giganews.com!nntp.giganews.com!wns14feed!worldnet.att.net!208.49.83.146!uns-out.usenetserver.com!news.usenetserver.com!pc02.usenetserver.com!fe167.usenetserver.com.POSTED!232df425!not-for-mail
From: Discreto <ftp777@terra.es>
User-Agent: Thunderbird 1.5.0.9 (Windows/20061207)
MIME-Version: 1.0
Newsgroups: es.comp.os.linux.programacion
Subject: Re: Problemas con punteros
References: <eq39a9$g7h$1@hercules.cohp1>
In-Reply-To: <eq39a9$g7h$1@hercules.cohp1>
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: quoted-printable
Lines: 125
Message-ID: <lLexh.10414$vZ.7278@fe167.usenetserver.com>
X-Complaints-To: abuse@usenetserver.com
X-Abuse-Info: Please be sure to forward a copy of ALL headers
X-Abuse-Info: Otherwise we will be unable to process your complaint properly.
NNTP-Posting-Date: Sun, 04 Feb 2007 01:08:17 EST
Date: Sun, 04 Feb 2007 07:08:09 +0100