2014-09-04 4 views
-2
#include<stdio.h> 
#include<stdlib.h> 
#include<conio.h> 

main() 
{ 
    int *ptr,i; 
    ptr=(int*)malloc(sizeof(int)); 
    printf("sizo of ptr is:%d",sizeof(ptr)); 

    for(i=0;i<30;i++) 
     scanf("%d",ptr+i); 

    for(i=0;i<30;i++) 
     printf("%d",*(ptr+i)); 

    getch(); 
} 

здесь размер PTR является: 4 мой вопрос, я полагаю, что магазин только один целое число в PTR, но здесь, в этой программе я мог хранить более 30 или 100 и т.д., почему он не бросает ошибку?Сколько памяти действительно выделяет malloc?

+8

Потому что сегодня вам повезло. Завтра это может закончиться. – jweyrich

+0

Я проверил эту программу в linux и windows. оба дают тот же результат. В настоящее время я использую dev C++. – user3614789

+0

Связанный вопрос о переполнении буфера в стеке (такой же общий ответ): http://stackoverflow.com/questions/23226217/why-buffer-overflow-doesnt-affect-to-this-code –

ответ

4

Malloc выделяет кучу пространства в кусках размера вашей системы (обычно 4096 байт), но он предназначен только для вашего использования точно столько, сколько вы просили. Если вы пишете за пределами своей памяти malloc, то вы рискуете развратить свою кучу или скомпрометировать свою программу с нарушением сегментации.

Гарантийное обслуживание: Ваш. Блок памяти за запрошенным вами может быть действительным, но используется другим (например, stdio буферами библиотеки) или зарезервирован для использования в будущем (например, следующий malloc, который вы вызываете).

Смежные вопросы