¿Cómo volver del trabajo puntero en strcat ()
Pregunta
Hola chicos estoy tratando de averiguar cómo punteros son devueltos por strcat (), así que he intentado implementar mi propia strcat () para ver cómo funciona. El siguiente es el código para mystrcat (), que funciona como el strcat real ():
char *mystrcat(char *destination, char *source)
{
char *str = destination;
while (*str != '\0')
{
str++;
}
while (*source != '\0')
{
*str = *source;
str++;
source++;
}
*str = '\0';
return str;
}
Así que digamos que en mi main (), tengo
char string[BUFSIZ];
mystrcat(string, "hello");
printf("%s\n", string);
La salida sería
hello
como se esperaba. Lo que no entiendo es cómo devolver la dirección de la variable local, str, mágicamente hacer que la variable, una cadena razón para ello y también por qué es la variable, str, no se eliminan cuando finaliza la función.
Solución
Usted no está devolviendo la dirección de la variable local. Usted está volviendo el valor de la variable local. Puesto que la variable en cuestión es un puntero, su valor pasa a ser una dirección. La dirección que se contiene en los puntos variables str
en el bloque de memoria proporcionada por la destination
argumento.
Lo que parece ser malentendido es que esto:
char* str = destination;
no crea una copia de la cadena destination
. Se crea un puntero llamado str
que los puntos en la misma posición de memoria que los puntos a destination
. Cuando se utiliza str
para manipular los personajes en ese bloque de memoria, la cadena representada por destination
también se modifica, debido str
y el punto destination
en el exactamente la misma cadena de caracteres en la memoria. Eso es lo que "mágicamente actualizaciones" el parámetro.
Otros consejos
str
es un puntero a la cadena que se pasa en (destino), por lo que está modificando su string
variable original desde dentro de su función strcat
.
El str
puntero no se borran al final de la rutina, pero no se necesita más.
Por cierto, es confuso utilizar la palabra "cadena" como el nombre de una variable, porque muchos idiomas se reservan string
como palabra clave.
La primera línea de la función, que está asignando * str a ser el mismo que * destino. En efecto, cuando regrese, usted está volviendo * destino, lo que es lo mismo que * str.
No se asigna memoria, por lo que debe ser eliminado sin memoria.