Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> malloc/realloc, маллок выделяет 16 байтов вместо 1 
:(
    Опции темы
6axyc
Дата 6.7.2012, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 29.4.2008

Репутация: нет
Всего: нет



проблемма такова имею стракт

Код

typedef struct Contact
{
    char *contactName;        // name of person
    char *contactNumber;    // phone number of person
    char identification;    // 0 - mobile; 1 - home; 2 - work;
}Contact;


при выделении места на сам стракт,*contactName по нулям badPtr.

когда отдельно выделяю место

Код

tempCont->contactName = (char*)malloc(sizeof(char));


то почемуто вместо одного чара, выделяется место под 16, 
а когда делаю

Код

tempCont->contactName = (char*)realloc(tempCont->contactName,sizeOfString*2);


, то выкидывает.

есть идеи?
PM MAIL   Вверх
boostcoder
Дата 6.7.2012, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



а теперь еще раз, не жуя, и на русском языке, пожалуйста.

PM WWW   Вверх
6axyc
Дата 6.7.2012, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 29.4.2008

Репутация: нет
Всего: нет



хмм даже и не знаю.
вобщем я сам не понимаю, что происходит.
так что не важно, как только пойму точнее, что происходит, опишу.
спасибо.
PM MAIL   Вверх
feodorv
Дата 6.7.2012, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(6axyc @  6.7.2012,  21:40 Найти цитируемый пост)
при выделении места на сам стракт,*contactName по нулям badPtr.

Конечно! Вот была бы "стракт" описана так:
Код

typedef struct Contact
{
    char contactName[16];        // name of person
    char contactNumber[16];    // phone number of person
    char identification;    // 0 - mobile; 1 - home; 2 - work;
}Contact;

то память под contactName выделялась бы вместе со стуктурой. А если же так, как приведено выше, то для contactName и contactNumber нужно дополнительно выделять память.


Цитата(6axyc @  6.7.2012,  21:40 Найти цитируемый пост)
tempCont->contactName = (char*)malloc(sizeof(char));

Если Вам этот один char нужен, чтобы хранить в нём \0, то уж лучше инициализировать NULL'ом:
Код

tempCont->contactName = NULL;

и в дальнейшем просто проверять значение полей на NULL.


Цитата(6axyc @  6.7.2012,  21:40 Найти цитируемый пост)
то почемуто вместо одного чара, выделяется место под 16, 

Интересно, как Вы это поняли...
Память в куче выделяется гранулярно, специально так сделано. Размер "гранулы" может составлять 8 байт (как в Windows) или больше (16 байт - тоже вариант))))


Цитата(6axyc @  6.7.2012,  21:40 Найти цитируемый пост)
tempCont->contactName = (char*)realloc(tempCont->contactName,sizeOfString*2);

Какое значение перед этим имели tempCont->contactName (абы какое, какое получилось после аллокации структуры?) и sizeOfString??? Просто так никто никого не выкидывает)))
Если воспользоваться NULL-значениями, то можно сделать так:
Код

int reallocName( Contact *Cont, size_t size)
{
  char *ptr;

  if( Cont->contactName == NULL )
    ptr = (char *) malloc( size );
  else
    ptr = (char *) realloc( Cont->contactName, size);

  if( ptr == NULL ) 
  {
    /* error */;
    return 0;
  }

  Cont->contactName = ptr;
  return 1;
}




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Dem_max
Дата 7.7.2012, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



возможно потому что менеджер памяти конкретного компилятора выделяем минимум 16 байт, чтобы избегать таких глупых выделений памяти по 1 байту со стороны программиста, проще выделить 16 байт, чем потом дефрагментировать память по 1 байту. 


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0550 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.