pointer bidimensional array c arrays variables char declaration

bidimensional - declare array c#



Declarando arraz con contenido dinĂ¡mico (1)

Hola, quiero hacer un programa que diga cuántas letras grandes y cortas hay en la palabra y demás, pero vaya al problema. No puedo declarar el contenido de la matriz de forma dinámica. Esto es todo código C. Intenté esto

char something; scanf("%c",somethnig); char somethingmore[]=something; printf("%c",something[0])

pero no fue posible compilar, también intenté algo como esto

char *something; scanf("%c",something); printf("%c",something[0]);

que fue posible compilar pero que se aplastó cuando se lo llamó puntero del array (apologo si la nomenclatura es incorrecta) programando al principiante así que esta es una pregunta tonta. Esto es solo un ejemplo del problema que corrí para no codificar mi programa.


Bueno, haciendo caso omiso de la sintaxis extrañamente incorrecta en su fragmento, creo que una buena respuesta se reduce a recordarle una cosa:

C no hace ninguna gestión de memoria por ti .

O, en otras palabras, administrar la memoria tiene que hacerse de forma explícita. Como consecuencia, las matrices tienen un tamaño fijo en C (deben conocerse en tiempo de compilación, por lo que el compilador puede reservar el espacio apropiado en el binario, generalmente en un segmento de datos , o en la pila para una variable local ).

Una excepción notable son las matrices de longitud variable en c99 , pero incluso con ellas, el tamaño de la matriz solo se puede establecer una vez: en la inicialización. Es una cuestión de gusto considerar esto como algo grandioso o simplemente como un error, pero no resolverá su problema de cambiar el tamaño de algo en tiempo de ejecución.

Si quiere hacer crecer dinámicamente algo, solo hay una opción: convertirlo en un objeto asignado y administrarlo usted mismo, usando las funciones malloc() , calloc() , realloc() y free() . Todas estas funciones son parte del estándar C, por lo que debe leerlas. Un uso típico (no relacionado con su pregunta) sería algo así como:

#include <stdlib.h> int *list = 0; size_t capacity = 0; size_t count = 0; void append(int value) { if (capacity) { if (count == capacity) { /* reserve more space, for real world code check realloc() * return value */ capacity *= 2; list = realloc(list, capacity * sizeof(int)); } } else { /* reserve an initial amount, for real world code check malloc() * return value */ capacity = 16; list = malloc(capacity * sizeof(int)); } list[count++] = value; }

Esto es muy simplificado, probablemente definirías un contenedor como una struct contiene tu puntero a la "matriz", así como la capacidad y los miembros del recuento y definirás funciones que trabajan en esa estructura en algún código del mundo real. O puede ir y usar contenedores predefinidos en una biblioteca como, por ejemplo, glib .