2013-12-22 3 views
-3

Существует таблица, которая должна расти после определенной функции. Каждый раз, когда таблица заполнена, вызывается функция addMemory, удваивая текущий размер таблицы -> table. Кажется, что все работает нормально, и просто для проверки программы я прокомментировал вызов addMemory, поэтому я ожидал ошибку сегментации, так как в ОС не запрашивалась новая память, но она не терпела неудачу, и это на самом деле записывая данные рядом с памятью malloc'ed без каких-либо ошибок. Интересно, почему это происходит ???Отсутствие ошибки сегментации без malloc

код здесь:

int main(){ 
    //user* newUser = (user*)malloc(BASE_SIZE*sizeof(user)); 
    user* newUser = (user*)malloc(sizeof(user)); 

    userTable* table = (userTable*)malloc(sizeof(userTable)); 
    newUser->age = 1000; 
    table->length = 0; 
    table->table= newUser; 
    table->length++; 

    int i = 0; 
    int memlimit = 1000; 
    for(i = 1; i < memlimit; i++){ 
     if(memZone(table->length-1) != memZone(table->length)){ 
//this is the line that asks for more memory 
      addMemory((void*)table,"userTable"); 
      printf("mem pos =%i, age = %i\n",table->length,table->table[i-1].age); 
     } 
     table->table[i].age = (1000 + i); 
     table->length++; 

    } 

    printf("All memory have been successfully allocated \n"); 
    int anything; 
    while(scanf("%i",&anything)){ 
     reduceMemory((void*)table,"userTable"); 
     printf("Age = %i \n",table->table[table->length - 1].age); 

    } 
} 

определения Struct эти из них:

typedef struct { 
    /* Username unique for this user in the system */ 
    char username[25]; 

    /* User name */ 
    char name[100]; 

    /* Age */ 
    unsigned int age; 

    /* User city */ 
    char city[128]; 

} user; 

/* Table of users */ 
typedef struct { 
    /* Array of users */ 
    user* table; 
    /* Number of registers in the table */ 
    int length; 
} userTable; 

ответ

1

В современных библиотеках C, таНос вообще просто выделяет память больше блоков, выделенных ядром. Он не переходит в ядро, чтобы каждый раз запрашивать больше памяти, что было бы неэффективно.

Таким образом, процессор и ядро ​​ОС, вероятно, не имеют понятия, что все идет не так, но это неверный код с неопределенным поведением, поэтому не делайте этого. В частности, следующий вызов malloc может перераспределить память, которую вы уже используете для чего-то еще.

+0

Это тот ответ, который я ищу, спасибо! – tomacco

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