Pregunta

cuando intento el siguiente código funciona bien. Me estoy perdiendo algo?

main()
{
    int *p;
    p=malloc(sizeof(int));
    printf("size of p=%d\n",sizeof(p));
    p[500]=999999;
    printf("p[0]=%d",p[500]);
    return 0;
}

Lo he probado con malloc (0 * sizeof (int)) o cualquier cosa, pero funciona muy bien. El programa sólo se bloquea cuando no uso malloc en absoluto. Así que incluso si asigno 0 de memoria para la matriz p, todavía almacena los valores correctamente. Así que ¿por qué estoy siquiera molestarse con malloc entonces?

¿Fue útil?

Solución

Puede aparece para el trabajo bien, pero no es muy seguro en absoluto. Al escribir datos fuera del bloque asignado de la memoria va a sobrescribir algunos datos que no debería. Esta es una de las mayores causas de violaciones de segmento y otros errores de memoria, y lo que está observando con él que aparece a trabajar en este programa corto es lo que hace tan difícil de cazar a la raíz del problema.

este artículo , en particular, la parte en la corrupción de la memoria, a comenzar a entender el problema.

Valgrind es una excelente herramienta para el análisis de los errores de memoria como la que usted proporciona.

@ David hizo un buen comentario. Comparación de los resultados de ejecutar su código de ejecutar el siguiente código . Tenga en cuenta los últimos resultados en un error de ejecución (con más o menos salida no es útil!) En ideone.com (haga clic en los enlaces), mientras que el primero tiene éxito como has experimentado.

main()
{
    int *p;
    p=malloc(sizeof(int));
    printf("size of p=%d\n",sizeof(p));
    p[500]=999999;
    printf("p[0]=%d",p[500]);
    p[500000]=42;
    printf("p[0]=%d",p[500000]);
    return 0;
}

Otros consejos

Si no asigna memoria, p tiene basura en él, por lo que escribir en él probablemente fallará. Una vez que ha hecho una llamada a malloc válida, p apunta a la ubicación de memoria válida y se puede escribir en él. Está sobrescribiendo la memoria que no se debe escribir en, pero nadie va a tomar tu mano y le dirá al respecto. Si ejecuta su programa y una memoria depurador como valgrind, que le dirá. Bienvenido a C.

Escribir allá del final de su memoria es un comportamiento indefinido ™, lo que significa que cualquier cosa podría suceder- incluyendo su operativo programa como si lo que acabas de hacer era perfectamente legal. La razón de su programa que se ejecuta como si se hubiera hecho malloc(501*sizeof(int)) son completamente aplicación específica, y de hecho puede ser específico para cualquier cosa, incluyendo la fase de la luna.

Esto se debe a P se le asignaría cierta dirección, independientemente del tamaño que utiliza con malloc (). Aunque, con un tamaño cero que estaría haciendo referencia a memoria no válida como la memoria no se ha asignado, pero puede ser en un lugar que pudiera no causa caída del programa, aunque el comportamiento será indefinido.

Ahora bien, si usted no utiliza malloc (), sería estar apuntando a una ubicación garbaging y tratando de acceso que es probable que caída del programa causa.

Lo he probado con malloc (0 * sizeof (int))

Según C99 si el tamaño pasó a malloc es 0, un tiempo de ejecución C puede volver ya sea un puntero nulo o la asignación se comporta como si la solicitud fue para no cero de la asignación, excepto que el puntero devuelto no debe eliminan las referencias. Por lo tanto, se define la aplicación (por ejemplo, algunas implementaciones devuelven un búfer de longitud cero) y, en su caso, usted no recibe una copia de puntero NULL, pero está utilizando un puntero que no debería ser using.If lo pruebas en un tiempo de ejecución diferente, podría conseguir una copia de puntero NULL.

Cuando se llama a malloc () un pequeño trozo de memoria está tallada en una página más grande para usted.

    malloc(sizeof(int));

realidad no asignar 4 bytes en una máquina de 32 bits (el asignador de almohadillas de TI hasta un tamaño mínimo) + tamaño de los metadatos montón utiliza para registrar el trozo a través de su vida útil (trozos se colocan en los contenedores en función de su tamaño y marcado en uso o libre por el asignador). hxxp: //en.wikipedia.org/wiki/Malloc o más específicamente hxxp:. //en.wikipedia.org/wiki/Malloc#dlmalloc_and_its_derivatives si se está probando esto en Linux

Así que la escritura más allá de los límites de su trozo no significa necesariamente que se va a estrellarse. En p + 5000 no está escribiendo fuera de los límites de la página asignado para ese trozo inicial, de manera que está técnicamente escribiendo a una dirección asignada válida. Bienvenido a la corrupción de memoria. http://www.google.com/search?sourceid=chrome&ie = UTF-8 y q = montón + desbordamientos

Nuestra CheckPointer herramienta puede detectar este error. Se sabe que la asignación de p era un trozo de 4 bytes, y por lo tanto se hace la asignación, que está fuera de la zona para la que se asignó p. Se dirá que la p [500] asignación es incorrecta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top