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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с malloc и free 
:(
    Опции темы
Animator
Дата 29.12.2007, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 Помогите пожалуйста в чём проблема.  Программа вылетает как только натыкается на free.
Среда VS6  Проект С++

Код

// Malloc.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

void printMas(int **p);

int main(int argc, char* argv[])
{
    int k = 0;
    int j = 2;
    int **p;

    p = (int**)malloc(sizeof(int)*6);
    for(int i = 0; i < 6; i++)
        p[i] = (int*)malloc(sizeof(int)*6);



    p[k][j] = 1;
    printf("p[k][j] = %d", p[k][j+2]);

    for(i = 0;i < 6; i++)
    {
        free(p[i]);
    }
    free(p);
    
    //ZeroMemory(p,sizeof(**p));    
    
    printf("Hello World!\n");
    printMas(p);
    return 0;
}
void printMas(int **p)
{
    for(int i = 0;i < 6; i++)
    {
        for(int j = 0; j < 6;j++)
        {
            p[i][j] = 0;
        
            printf("%d",p[i][j]);
            
        }
        printf("\n");
    }
}




PM MAIL ICQ   Вверх
archimed7592
Дата 29.12.2007, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(Animator @  29.12.2007,  18:20 Найти цитируемый пост)
p = (int**)malloc(sizeof(int)*6);

Код

p = (int**)malloc(sizeof(int *)*6);



Цитата(Animator @  29.12.2007,  18:20 Найти цитируемый пост)
    free(p);
    
    //ZeroMemory(p,sizeof(**p));    
    
    printf("Hello World!\n");
    printMas(p);

Ты удаляешь массив, а потом пытаешься распечатать - тебе не кажется, что последовательность действия должна быть в точности до наоборот?


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Animator
Дата 29.12.2007, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



archimed7592 да нет я не об этом. Ну вот я убрал ненужный код. Посмотрите пожалуйста чего не работает? smile 
Код

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

void printMas(int **p);
void initial(char **p);
void shutdown(char **p);
char **p;
int main(int argc, char* argv[])
{
 

    initial(p);
    shutdown(p);

    return 0;
}
void initial(char **p)
{
    p = (char**)malloc(sizeof(char)*6);
    for(int i = 0; i < 6; i++)
        p[i] = (char*)malloc(sizeof(char)*6);

}
void shutdown(char **p)
{
    for(int i = 0;i < 6; i++)
    {
        free(p[i]);
    }
    free(p);
}



PM MAIL ICQ   Вверх
bsa
Дата 29.12.2007, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Animator, ошибка в строке №21 и потенциальная ошибка в строке №23.
В строке №21 ты выделяешь 6 чаров (6 байт), а в большинстве слуев, тебе нужно в 4 раза больше. если бы ты имел привычку использовать sizeof(*p) вместо явного указания типа, то такой ошибки бы не было:
Код
void initial(char **p)
{
    p = (char**)malloc(sizeof(*p)*6);
    for(int i = 0; i < 6; i++)
        p[i] = (char*)malloc(sizeof(*p[i])*6);
}

PM   Вверх
archimed7592
Дата 30.12.2007, 06:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Есть ещё одна ошибка(основная).

Цитата(Animator @  29.12.2007,  23:21 Найти цитируемый пост)
char **p;

Цитата(Animator @  29.12.2007,  23:21 Найти цитируемый пост)
void initial(char **p)

Цитата(Animator @  29.12.2007,  23:21 Найти цитируемый пост)
void shutdown(char **p)


Подумай, не слишком ли много у тебя где p фигурирует? smile


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
bsa
Дата 30.12.2007, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



archimed7592, имхо, это потенциальная ошибка. Имхо, логика работы программы сейчас из-за нее не страдает.
PM   Вверх
archimed7592
Дата 30.12.2007, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(bsa @  30.12.2007,  11:38 Найти цитируемый пост)
archimed7592, имхо, это потенциальная ошибка. Имхо, логика работы программы сейчас из-за нее не страдает.

Ну как же не страдает? smile
См. комментарии:
Код

void printMas(int **p);
void initial(char **p);
void shutdown(char **p);
char **p; // ::p = 0
int main(int argc, char* argv[])
{
    //::p = 0
    initial(p);
    // ::p = 0
    shutdown(p);
    return 0;
}
void initial(char **p)
{
    // p = 0, ::p = 0
    p = (char**)malloc(sizeof(char)*6);
    // p = buffer, ::p = 0
    // ...
    for(int i = 0; i < 6; i++)
        p[i] = (char*)malloc(sizeof(char)*6);
}
void shutdown(char **p)
{
    // p = 0, ::p = 0
    for(int i = 0;i < 6; i++)
    {
        // попытка освободить память по адресу p[i] == *(p + i) == *(0 + i)
        free(p[i]);
    }
    free(p);
}



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
bsa
Дата 30.12.2007, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



блин. точно. в initial() надо еще по одной звездочке приписать...
Код
void printMas(int **p);
void initial(char **p);
void shutdown(char **p);
char **p;
int main(int argc, char* argv[])
{
    initial(&p);
    shutdown(p);
    return 0;
}
void initial(char ***p)
{
    *p = (char**)malloc(sizeof(**p)*6);
    for(int i = 0; i < 6; i++)
        (*p)[i] = (char*)malloc(sizeof(***p)*6);
}
void shutdown(char **p)
{
    for(int i = 0;i < 6; i++)
        free(p[i]);
    free(p);
}


Это сообщение отредактировал(а) bsa - 30.12.2007, 18:14
PM   Вверх
archimed7592
Дата 30.12.2007, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Лучше было бы, если он сам дошёл бы до готового кода.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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