Definir cadenas utilizando punteros versus arreglos de caracteres en C
Estoy confundido acerca de cómo funcionan los punteros a caracteres. ¿Qué sucede cuando ejecuto el siguiente código?
int main()
{
char* word;
scanf("%s",word);
printf("%s",word);
}
La primera línea de la función main define un puntero a char sin inicialización. ¿No es así que scanf debe almacenar la palabra en algún lugar y dar la dirección al puntero? ¿Y si ingreso una cadena grande, sobrescribirá algo en la memoria?
Además, ¿qué sucede en la primera línea del siguiente código además de definir un puntero a char? ¿El compilador establece algunos límites? ¿O no puedo exceder el tamaño especificado, verdad? Si lo hago, ¿tendré un error en tiempo de ejecución? ¿Cuál es la diferencia entre los dos casos?
int main()
{
char word[100];
scanf("%s",word);
printf("%s",word);
}
¿Y qué pasa con los punteros a otros tipos? ¿Puedo seguir escribiendo en los siguientes lugares utilizando desplazamientos?
davy.ai
En el primer fragmento de código, el puntero
word
se define sin inicialización. Cuando se llama ascanf
, almacenará la palabra ingresada por el usuario en la memoria y asignará la dirección de la palabra al punteroword
. Si la cadena de entrada es más grande que la memoria asignada al puntero, causará un desbordamiento de búfer y sobrescribirá otros datos en la memoria.En el segundo fragmento de código, el arreglo
word
se define con un tamaño de 100. Cuando se llama ascanf
, almacenará la palabra ingresada por el usuario en el arregloword
y no excederá el tamaño especificado. Si la cadena de entrada es más grande que el tamaño del arreglo, causará un error en tiempo de ejecución.Se pueden utilizar punteros a otros tipos para acceder a ubicaciones de memoria. Sin embargo, es importante asegurarse de que las ubicaciones de memoria sean válidas y que no se sobrescriba los datos.