malloc ... неожиданное поведение c программированием - PullRequest
0 голосов
/ 03 марта 2011
#include<stdio.h>
#include<malloc.h>
#include<string.h>

void foo( char ** ptr)
{
   *ptr = malloc(0); // allocate some memory**
   strcpy( *ptr, "Hello World");
}

int main()
{
   char *ptr = 0;
   // call function with a pointer to pointer
   foo( &ptr );
   printf("%s\n", ptr);
   // free up the memory
   free(ptr);

   return 0;
}

и он также работает

#include<stdio.h>
#include<malloc.h>
#include<string.h>

void foo( char ** ptr)
{
   *ptr = malloc(11); // allocate some memory
   strcpy( *ptr, "Hello World");
}

int main()
{
   char *ptr = 0;
   // call function with a pointer to pointer
   foo( &ptr );
   printf("%s\n", ptr);
   // free up the memory
   free(ptr);

   return 0;
}

изменить malloc на любое число ... оно всегда запущено. Как это возможно ???? Hello World имеет 12 символов, так что можно запустить в 0,12,8, любое число.

Ответы [ 4 ]

3 голосов
/ 03 марта 2011

Вы столкнулись с тем фактом, что C не выполняет проверку границ.Таким образом, ваша копия в памяти malloc'а перерасходует выделение и «записывает» в любую память.Результаты undefined .Это может сработать, это может привести к сбою, это может сделать вас чашкой кофе.Вы не знаете.

Кстати, это ошибка, которая приводит к атакам с переполнением буфера.

2 голосов
/ 03 марта 2011

В коде явно есть ошибки.

Есть две возможности:

  1. Вам повезло, что strcpy () ничего не значит, поэтому программа запускается.

  2. malloc () часто выделяет на несколько байт больше, чем требуется, для лучшего выравнивания памяти. Вполне возможно, что он выделяет кусками по 16 физических байтов, например.

0 голосов
/ 03 марта 2011

Распространено заблуждение, что подобные ошибки должны вызывать сбой программы.Фактически, в стандарте C прямо говорится, что для такого неопределенного поведения, как этот, существует «этот международный стандарт, не предъявляющий никаких требований».

Таким образом, программа может сразу аварийно завершить работу, она может испортить случайные данные или можетпохоже на работу.Это просто небезопасно, как сказал Эд.

0 голосов
/ 03 марта 2011

C не волнует, сколько вы на самом деле выделяете (кроме 0; если вы это сделаете, все может стать уродливым); до тех пор, пока вы не переступите различные произвольные искусственные границы, ваша программа будет работать. Ты просто не ударил ни одного из них.

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