Форум программистов, компьютерный форум CyberForum.ru

Динамическое выделение памяти - C++

Восстановить пароль Регистрация
 
cripok
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 15
22.03.2013, 19:59     Динамическое выделение памяти #1
Добрый день. Возник вопрос:
Как мне узнать адрес последнего байта в выделенной памяти?
Я выделил память (массив нулей и единиц):
C++
1
bool *b = (bool *) malloc(100);
Я хочу сохранить адрес последнего элемента (байта) этого массива в переменной. Как это сделать?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SDev
43 / 41 / 10
Регистрация: 15.03.2013
Сообщений: 88
22.03.2013, 20:06     Динамическое выделение памяти #2
C++
1
2
bool *b = (bool *) malloc(100);
bool *last=&b[99]; // или last=b+99;
cripok
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 15
22.03.2013, 20:20  [ТС]     Динамическое выделение памяти #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
 
int main()
{
    bool *b = (bool *) malloc(100);
    bool *last=&b[99];  
    if (b==NULL)
    {
        printf("ololo");
        return 1;
    }
 
    for (int i=0;i<10;i++)
    {
        b[i]=i%2;
        printf("%d ",&b[i]);
    }
    printf("%d ",&last);
 
 
    getch();
    return 0;
}
адреса переменной last и посл элемента различаются в чем ошибка?

Добавлено через 10 минут
или даже так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
 
int main()
{
    bool *b = (bool *) malloc(100);
    bool *last=&b[99];  
    if (b==NULL)
    {
        printf("ololo");
        return 1;
    }
 
    printf("%d ",&b[99]);
    printf("%d ",&last);
 
 
    getch();
    return 0;
}
Добавлено через 2 минуты
вот результат:
http://i5.pixs.ru/storage/7/7/9/1png...68_7476779.png
Кудаив
328 / 405 / 24
Регистрация: 27.05.2012
Сообщений: 1,162
Завершенные тесты: 2
22.03.2013, 20:22     Динамическое выделение памяти #4
C++
1
printf("%d ",&last);
так выводится адрес указателя Last -место где лежит сам last

Добавлено через 27 секунд
C++
1
printf("%d ",last);
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,899
Записей в блоге: 2
Завершенные тесты: 1
22.03.2013, 20:23     Динамическое выделение памяти #5
Разные переменные - разные адреса.
cripok
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 15
22.03.2013, 20:24  [ТС]     Динамическое выделение памяти #6
ааа, благодарю, уяснил..
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 44
22.03.2013, 20:34     Динамическое выделение памяти #7
Цитата Сообщение от cripok Посмотреть сообщение
if (b==NULL)
{
printf("ololo");
return 1;
}
как Вы сделали так что у вас работает это условие? У меня длинный длинный код и часто необходимо выделять и освобождать память, решила сделать две отдельные функции для этого. Но стоит прописать это условие и сразу выдается ошибка, что это неопределенное исключение.

C++
1
2
3
4
5
6
void AlocatePicture(double* &img)
{
    if (img!=NULL)
        delete []img;
    img=new double[5];
}
Нашла инфу что вместо NULL возможно писать так же nullptr и просто 0, но вечно как только нажмешь debugging выдает сообщение о неопределенном исключении.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
22.03.2013, 23:14     Динамическое выделение памяти #8
Цитата Сообщение от Eumi Посмотреть сообщение
Нашла инфу что вместо NULL возможно писать так же nullptr и просто 0, но вечно как только нажмешь debugging выдает сообщение о неопределенном исключении.
(Можете не проверять перед delete на NULL/0/nullptr, он обязан молча жевать нули и ничего при этом не делать.)
Скорее всего вы не инициализировали тот указатель, на который передаёте ссылку. В результате delete пытается освободить память, которую вы до этого не выделяли. Всегда инициализируйте все переменные. Особенно указатели.
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 44
22.03.2013, 23:51     Динамическое выделение памяти #9
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
(Можете не проверять перед delete на NULL/0/nullptr, он обязан молча жевать нули и ничего при этом не делать.)
Скорее всего вы не инициализировали тот указатель, на который передаёте ссылку. В результате delete пытается освободить память, которую вы до этого не выделяли. Всегда инициализируйте все переменные. Особенно указатели.
в этой функции и пытаюсь выделить память и инициализировать, то есть только в случае если указатель не равен нулю, он удаляет, а если равен выделяет память. Для освобождения память у меня другая функция:

C++
1
2
3
4
5
6
7
8
9
10
void DealocatingPicture(double* &img)
{
    if (img==NULL)
        return;
    else
    {
        delete []img;
        img=NULL;
    }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2013, 23:57     Динамическое выделение памяти
Еще ссылки по теме:

C++ Динамическое выделение памяти
Динамическое выделение памяти C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
22.03.2013, 23:57     Динамическое выделение памяти #10
C++
1
2
3
4
5
6
bool *b = (bool *) malloc(100);
bool *last=&b[99];
// вот тут ошибка в том, что выделилось сто байт а не сто булов.
// размер була может отличатся от одного байта. правильно:
bool *b = (bool *) malloc(100 * sizeof(bool));
bool *last=&b[99];
Yandex
Объявления
22.03.2013, 23:57     Динамическое выделение памяти
Ответ Создать тему
Опции темы

Текущее время: 04:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru