1. Си / Говнокод #17609

    +133

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    int main(void)
    {
    	int a=0,b=1000;
    	int * p;
    	p=malloc(sizeof(int)*b-7); // уменьшаем выделяемую память на 7 байт, а почему оно не падает?
    	for(;a<b;a++) p[a]=a;
    	printf("%lu",sizeof(int)*b);
    	free(p);
    }

    а если убрать 8 байт то уже падает,что-то где-то округляется что-ли?

    Запостил: pl7ofit, 10 Февраля 2015

    Комментарии (14) RSS

    • Да - http://man7.org/linux/man-pages/man3/posix_memalign.3.html

      The glibc malloc(3) always returns 8-byte aligned memory addresses,
      so these functions are needed only if you require larger alignment
      values.
      Ответить
      • хмм, спасибо, не знал =)
        Ответить
        • Но лучше делать вид, что ты об этом округлении не знаешь. И не лезть за запрошенные в malloc()'е границы. Ибо UB.

          P.S. На самом деле, на стеке тоже всё округляется. Не только в куче. И в структурах между полями тоже досыпается мусор, чтобы они по правильно выровненным адресам ложились.
          Ответить
          • Лучше всё же знать и проверять каждую строчку с malloc, зная, что код может заработать.
            Ответить
            • Можно под valgrind'ом или его аналогами погонять. Он неплохо ловит вылет за границы выделенных блоков.
              Ответить
          • понятно, а значит ли это что при выделении памяти под строку не нужно дописывать +1 для нулевого байта?
            Ответить
            • А если в строке 8N символов? 8N округлится до 8N < 8N + 1. (Это, если забыть мудрые слова Борманда о том, что так делать нельзя и начать рассуждать.)
              Ответить
            • Сколько байтов собираешься трогать - столько и выделяй. Если у тебя строка с завершающим нулём - выделяешь strlen(s)+1 байт.
              Ответить
    • автору пора бы познакомиться уже с термином UB
      Ответить
      • После чего разочароваться в крестах, забить на них и спиться.

        "Как можно писать на языке, в котором даже в сложении двух целых чисел таится UB?"
        Ответить
        • >После чего разочароваться в крестах
          сначала разочароваться в сишечке придется, а уж потом в крестах
          Ответить
          • Да можно сразу и в том и в том.
            Ответить
            • поеду в Баден-Баден за собакой чау-чау и разочаруюсь и в том, и в том.
              Ответить
    • - Они хотят сделать контрольные анализы, а потом отпустить тебя.
      Ответить

    Добавить комментарий