помогите разобраться с этим простым malloc в C - PullRequest
1 голос
/ 20 декабря 2010

Вот код, который я хочу понять:

#include <stdio.h>
#include <stdlib.h>
#define MAX 100

int main()
{

    int *ptr = (int *)malloc(5 * sizeof(int)),i;

    for(i=0;i<MAX;i++)
    {
        ptr[i] = i;
    }

    for(i=0;i<MAX;i++)
    {
        printf("%d\n",ptr[i]);
    }

    return 0;
}

Мой вопрос: я выделил 5 * int памяти, но почему это занимает более 5 integer?Thnx

Ответы [ 5 ]

4 голосов
/ 20 декабря 2010

Вы зарезервировали место для 5 целых чисел.Для остальных 95 целых чисел вы пишете в пространство, зарезервированное для других целей.Ваша программа может или не может произойти сбой, но вы должны ожидать, что она потерпит неудачу так или иначе.

2 голосов
/ 20 декабря 2010

Он не «берет» более 5 целых чисел: вы выделили 5 * sizeof(int) и вызываете неопределенное поведение, обращаясь к памяти сверх этого размера.

Нет сомнений в том, следует ли устанавливать MAX на 10, 1024 или 100000: код в корне неверен, и тот факт, что он не сработал при запуске, не делает его менее неправильным. Такие инструменты, как valgrind, могут помочь вам обнаружить такие ошибки.

2 голосов
/ 20 декабря 2010

Не «берет» более 5 целых чисел;вы просто вызываете неопределенное поведение.Вы не можете ожидать, что код будет «успешным», даже если вы видите, что он работает в вашей реализации.

1 голос
/ 20 декабря 2010

C не выполняет проверку границ массивов.Если у вас есть 5-элементный массив, C с радостью позволит вам присвоить arr[5], arr[100] или даже arr[-1].

Если вам повезет, это просто перезапишет неиспользуемую память и вашПрограмма все равно будет работать.

Если вам не повезет, вы перезапишете другие переменные в вашей программе, метаданные для malloc или ОС, и произойдут плохие вещи.Привыкайте видеть фразу «ошибка сегментации».

1 голос
/ 20 декабря 2010
  • Вы выделяете 5 целых чисел, все, что вы пишете или читаете больше, чем это неверно
  • Границы защиты ОС составляют 1 страницу, что обычно означает 4 КБ.
  • Дажеесли вы выделили только 5 целых чисел, остальная часть страницы остается незащищенной.Вот как происходит переполнение буфера и многие ошибки в работе программы

  • Я держу пари, если ваш MAX установлен на 1025, у вас будет ошибка сегмента (если это ваша программа)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...