Autor
|
Tema: Problema: Tamaño de Puntero char (Leído 6,687 veces)
|
yovaninu
Desconectado
Mensajes: 349
|
Hola, tengo el siguiente codigo: * Un puntero cad a char * De tamaño 10 Luego de inicializarlo con strcpy, voy agregando cadenas con strcat, pero al ser la variable cad de 10 elementos, ¿no deberia haber un error? Ademas mi idea es concatenar 'n' caracteres y no solamente '10', es decir no se sabe cuantas cadenas recibira la variable cad, ¿cual seria la declaracion? #include <stdio.h> #include <string.h> int main() { char *cad; cad=new char[10](); strcpy(cad,""); strcat(cad,"123"); strcat(cad,"456"); strcat(cad,"789"); strcat(cad,"abc"); //<-- Aqui deberia haber un error strcat(cad,"def"); //<-- Aqui tambien pero el programa corre strcat(cad,"def"); //<-- Aqui el programa cierra abruptamente printf("%s\n",cad); return 0; }
Saludos.
|
|
« Última modificación: 15 Agosto 2011, 22:59 pm por yovaninu »
|
En línea
|
|
|
|
|
yovaninu
Desconectado
Mensajes: 349
|
En C++, bajo VS 2005: y este código???: #include <stdio.h> #include <string.h> int main() { char *cad; cad=new char[10]; strncpy(cad,"",1); strncat(cad,"123",3); strncat(cad,"456",3); strncat(cad,"789",3); strncat(cad,"789",3); // ??? strncat(cad,"789",3); // ??? strncat(cad,"789",3); //<-- Crash!!! printf("%s\n",cad); return 0; }
Y sigo con la duda de como concatenar 'n' caracteres al primer parametro de strncat, ya que segun la definicion del codigo solo podria juntarle hasta 10 caracteres (claro que parece que recibe 15, luego se cierra el programa).
|
|
|
En línea
|
|
|
|
Gallu
Desconectado
Mensajes: 247
|
Lo que sucede es que está machacando memoria que no le corresponde , al hacer el new [10] reservas memoria para un char de 10 , y solo le pertenecen 10 posiciones , pero como trabajas con punteros le puedes seguir asignando chars a la cadena , la función
no controla que cad pase del límite , lo único que controla es que el segundo argumento de dicha función tenga la longitud especificada en el tercer argumento , si es mayor no copia los caracteres restantes. Ejecuta este y veras #include <stdio.h> #include <string.h> int main() { char *cad[2]; char *cad2; cad[0]=new char[10]; cad[1]=new char[10]; //strncpy(cad[0],"",1); strncat(cad [0],"789",3); //<-- Crash!!! printf("%s %s\n",cad [0] , cad [1]); return 0; }
|
|
|
En línea
|
Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.
|
|
|
yovaninu
Desconectado
Mensajes: 349
|
Me cuesta entender a cerca de las cadenas dinamicas. Por ejemplo en Basic declaramos esto y 'Archivo' puede ser tan grande o pequeño como querramos. En todo caso ¿cual es el equivalente en C++? para la variable archivo. Mi idea inicial era tener una variable 'cad' inicializarla con algo como esto: y en 'cad' poder ir acumulando tantas frases o palabras como yo quisiera. por ejemplo strcat(cad,"123"); strcat(cad,"456"); strcat(cad,"789"); strcat(cad,"abc"); strcat(cad,"def"); strcat(cad,"ghi"); strcat(cad,"jkl"); strcat(cad,"mno"); ...
para luego de mostrar a 'cad' con me muestre por pantalla:
|
|
|
En línea
|
|
|
|
.:BlackCoder:.
Desconectado
Mensajes: 388
Cada dia C++!!
|
Supongo que te conviene leer sobre las variables del tipo "string", lee sobre esta clase antes de simplemente aprender a usarla... Tambien deberias leer sobre los "contenedores". http://www.cplusplus.com/reference/string/string/Saludos... PD: Lee sobre memoria dinamica
|
|
|
En línea
|
"No te esfuerzes por saber mas, esfuerzate por ser el mejor en lo que sabes... Y asi sabras mas" .:BlackCoder:. jajaja
|
|
|
yovaninu
Desconectado
Mensajes: 349
|
Estoy yá, leendo al respecto, hice algunas pruebas con algunos ejemplos y al parecer funciona. Sin embargo asumo que este nuevo tipo de dato es exclusivo de C++, y cual 'era' o 'es' la forma de hacerlo al puro estilo de C o Ansi C.
Gracias por todo.
|
|
|
En línea
|
|
|
|
Karman
|
Luego de inicializarlo con strcpy, voy agregando cadenas con strcat, pero al ser la variable cad de 10 elementos, ¿no deberia haber un error? te lo explico brevemente, cuando haces uso de malloc/new con valores pequeños la memoria reservada está en el heap (un espacio ya reservado para ser usado de esta forma), por lo que es posible que puedas desbordar el buffer hasta cierto límite (mientras lo que sobreescribas no afecte directamente a otro proceso/función, ya que si lo haces terminará provocando un error [los cuales son los más complicados de encontrar]), tb tienes que tener en cuenta que los tamaños son "redondeados" a tamaños prácticos para el CPU (en el caso del heap son alineados a sizeof(*void) [cuyo tamaño es distinto si es 32 o 64 bits] si mal no recuerdo) y en caso de espacios grandes de memoria a una página (512 bytes aprox), entonces si reservas 10 bytes, el redondeo será de 12 [en 32 bits] (3*sizeof(*void)=3*4=12) S2
|
|
|
En línea
|
|
|
|
Gallu
Desconectado
Mensajes: 247
|
y cual 'era' o 'es' la forma de hacerlo al puro estilo de C o Ansi C.
??? La respuesta es con realloc http://c.conclase.net/librerias/?ansifun=reallocAquí un ejemplo sencillo: #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_CADENA 10 int main() { char *cad; char *char_aux ; int size_entrada = 0 , size_restante = 0; int aux = 1; //reservamos espacio para 10 char cad = (char *) malloc(sizeof(char) * MAX_CADENA ); char_aux = (char *) malloc(sizeof(char) * MAX_CADENA ); do{ puts("ingresa una cadena(maximo 10 carácteres)"); fgets(char_aux , MAX_CADENA , stdin ); size_entrada = strlen(char_aux ); size_restante = MAX_CADENA - strlen(cad ); if(size_restante < size_entrada){ aux++; cad = (char*) realloc(cad , MAX_CADENA * aux ); } //pasamos del salto de linea strncat(cad , char_aux ,size_entrada - 1); }while (strcmp(char_aux , "\n") != 0 ); return 0; }
Saludos.
|
|
|
En línea
|
Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
martiz de char doble puntero
Programación C/C++
|
neo_from_cs_matrix
|
2
|
6,641
|
15 Julio 2011, 00:05 am
por rir3760
|
|
|
duda doble puntero char a matriz de char
Programación C/C++
|
neo_from_cs_matrix
|
3
|
6,315
|
5 Septiembre 2011, 03:53 am
por rir3760
|
|
|
[AYUDA] Cómo puedo concatenar un char a un puntero de chars?
Programación C/C++
|
papita5
|
8
|
6,797
|
19 Octubre 2011, 20:39 pm
por papita5
|
|
|
Problema con variables puntero
Programación C/C++
|
oxi12pek
|
7
|
3,213
|
5 Noviembre 2012, 17:26 pm
por BatchianoISpyxolo
|
|
|
¿Pregunta puntero a char en c++?
« 1 2 »
Programación C/C++
|
Zodiak98
|
11
|
6,702
|
23 Abril 2013, 17:01 pm
por rir3760
|
|