Preguntas sobre el lenguaje C
Prototipo: externvoid * malloc (archivo de encabezado int unsigned num _ bytes: malloc.h o alloc.h se puede usar en TC2.0 (nota: el contenido de alloc.h y malloc.h). Exactamente lo mismo), mientras que en Visual C 6.0 puedes usar malloc.h o stdlib.h. Función: Asigna un bloque de memoria de longitud num_bytes. Valor de retorno: si la asignación se realiza correctamente, se devuelve un puntero a la memoria asignada; de lo contrario, se devuelve un puntero nulo; Cuando la memoria ya no se usa, se debe usar la función free() para liberar el bloque de memoria. Nota: Con respecto al prototipo de esta función, malloc devolvió un puntero char en la versión anterior, pero el nuevo estándar ANSIC estipula que esta función devuelve un puntero vacío, por lo que se requiere conversión de tipo. Explicación del nombre: el nombre completo de malloc es asignación de memoria, y en chino se llama asignación de memoria dinámica.
void * malloc(int size); Descripción: malloc se aplica al sistema para asignar espacio de memoria del tamaño de bytes especificado. El tipo de devolución es nulo*. Void* representa un puntero sin tipo. C, C estipula que el tipo void* se puede convertir a un puntero de cualquier otro tipo. Se puede ver en la declaración de la función. Existen al menos dos diferencias entre malloc y new: new devuelve un puntero del tipo especificado y puede calcular automáticamente el tamaño requerido. Por ejemplo: int * p; p = new int // El tipo de retorno es int* (puntero de entero) y el tamaño de asignación es sizeof(int) o: int * parrparr = new int[100]; el tipo de retorno es tipo int* (puntero entero), el tamaño de asignación es sizeof(int)*100, mientras que nosotros debemos calcular Malloc y luego convertirlo a la fuerza en un puntero del tipo real después de regresar. int * p; p = (int *) malloc (sizeof (int)); Primero, la función malloc devuelve tipo void *. Para C, si escribe: p = malloc(sizeof(int)); entonces el programa no se puede compilar y el error es: "void* no se puede asignar a una variable de tipo int *". Por lo tanto, debe ser emitido por (int *). Para C, no existe tal requisito, pero para trasplantar programas C a C de manera más conveniente, se recomienda desarrollar el hábito de la conversión forzada. En segundo lugar, el parámetro de la función es sizeof (int), que se utiliza para representar el tamaño requerido de un dato entero. Si escribe: int * p = (int *) malloc (1); el código también se puede compilar, pero en realidad solo se asigna 1 byte de espacio de memoria. Si almacena un número entero en él, se quedará sin hogar con 3 bytes y simplemente "vivirá en la casa del vecino". El resultado es que se sobrescribe el contenido de los datos originales en la memoria backend. Malloc también puede lograr el efecto de nuevo [] y solicitar una memoria continua especificando el tamaño de memoria que necesita. Por ejemplo, si desea asignar 100 espacios de tipo int: int * p = (int *) malloc (sizeof (int) * 100); // Asigne espacio de memoria que pueda acomodar 100 enteros. Otra diferencia que no es directamente visible es que malloc solo asigna memoria y no puede inicializar la memoria obtenida, por lo que el valor de una nueva memoria será aleatorio. Excepto por los diferentes métodos de asignación y liberación final, el puntero se obtiene mediante malloc o new, y otras operaciones son consistentes.
Cree un caso especial y agregue char * ptrif((ptr =(char *)malloc(0))= = NULL) puts("obtuve un puntero nulo"); else puts("obtuve un puntero válido en este momento"); lo que obtienes es un puntero válido. Asignar 0 a malloc da como resultado un puntero legal.
El mecanismo de trabajo de la función de edición en este párrafo
La esencia de la función malloc es que tiene la llamada lista enlazada libre, que conecta los bloques de memoria disponibles en una larga lista. Cuando se llama a la función malloc, busca en la tabla de conexiones un bloque de memoria lo suficientemente grande como para satisfacer la solicitud del usuario. Luego, divida el bloque de memoria en dos partes (un bloque igual al tamaño solicitado por el usuario y el otro bloque del tamaño de los bytes restantes). A continuación, la memoria asignada al usuario se pasa al usuario y la memoria restante (si la hay) se devuelve a la tabla de unión. Cuando se llama a la función gratuita, conecta el bloque de memoria liberado por el usuario a la cadena libre. Con el tiempo, la cadena inactiva se cortará en muchos pequeños fragmentos de memoria. Si el usuario solicita fragmentos de memoria grandes en este momento, es posible que no haya fragmentos en la cadena gratuita que cumplan con los requisitos del usuario. Entonces, la función malloc solicita un retraso y comienza a buscar fragmentos de memoria en la cadena libre, clasificándolos y fusionando pequeños bloques libres adyacentes en bloques de memoria más grandes. Si no se puede obtener un bloque de memoria que cumpla con los requisitos, la función malloc devolverá un puntero nulo, por lo que cuando llame a malloc para solicitar dinámicamente un bloque de memoria, debe determinar el valor de retorno.
Por ejemplo: 1: (ejecutándose en Visual C 6.0)
# include ltstdio.h gt
# include ltstdlib.h gt
int main()
{ int i, j; int * array = NULLscanf("d ", ampI
array = (int *)malloc(I * sizeof); (int));
for(j = 0; j lt i; j )
scanf("d ", amparray[j]);
for(j = 0;j lti;j)
printf("d\n ",array[j]);
free(array);
matriz = NULL
devuelve 0;
}