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

Как правильно? - C++

Восстановить пароль Регистрация
 
 
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
27.08.2011, 15:37     Как правильно? #1
Совершать итерацию, по куску памяти выделенному в куче?

например
C++
1
int* t = new int [10];
Как перемещаться. С каким шагом?


Или
C++
1
2
3
4
5
struct S
{
int a;
};
S* st = new S [10]
Как мне подсказали на форуме минимальный адресуемый размер это байт.
на встроенном массиве:

C++
1
2
3
4
5
6
int mas [10] ={0};
 
mas [6] = 7;
 
int* z1 = & mas[1];
int* z2 = & mas[2];
шаг равен 4, т.е. размеру инта (z1, z2);
А в куче?

C++
1
2
t++; //отличается более чем на 4;
t+sizeof(int);// тоже адрес более чем на 4 отличается.
В чем ошибка? Как перемещаться подскажите плиз
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
27.08.2011, 15:56     Как правильно? #2
AzaKendler, ничего не понятно. Чего вы добиваетесь? Что не получается?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
27.08.2011, 15:56     Как правильно? #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
#include <iostream>
 
struct Int {
    int val;
};
 
int main(){
    const int size(10);
 
    Int * arr = new Int [ size ];
 
    for ( int i = 0; i < size; ++i )
        arr[i].val = i + 1;
 
    int cnt = size;
    Int * ptr = arr;
 
    while ( cnt-- )
        std::cout << (ptr++)->val << ' ';
 
    std::cout << std::endl;
    delete [] arr;
    return 0;
}
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
27.08.2011, 15:58     Как правильно? #4
Вы боитесь, что компилятор будет выдавать неправильные смещения? Не бойтесь, всё будет так же, как со статическими массивами. Суть не в том, где и кем выделена память, а в типе указателя, который на эту память указывает.

Добавлено через 38 секунд

Не по теме:

easybudda, ты оказался проницательнее)))

AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
27.08.2011, 15:59  [ТС]     Как правильно? #5
суть в том что получаю хип коррупшн при попытке удаления
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
27.08.2011, 16:01     Как правильно? #6
AzaKendler, ну так покажите весь код, а не эти абстрактные куски.
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
27.08.2011, 16:24  [ТС]     Как правильно? #7
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
28
29
30
template <class Z> class test
{
struct A
{
int val;
A(){val=0;}
};
 
A* top;
size_t size;
 
test(size_t s)
{
size = s;
top = new A[size];
}
 
 
Z& operator [] (size_t i)
{
 
return (top+sizeof(A)*i)->val;  
//return top[i].val;
//return (top+sizeof(A*)*i)->val;
}
 
 
~test(){delete  []top;}
 
}


C++
1
2
3
4
5
6
7
8
9
10
int main(void)
{
 
test<int> t(3);
 
t[0]=6;
t[2] =5;
 
return 0;
}
примерно так. вкратце/


ХМ....я был очень удивлен. когда решил проверить еще раз перед тем как отправить. Все удалилось корректно. Расскомменил работающую строку в операторе [].
Он принимал инт хотя везде было сайз_т. Это я проверял всякие варианты и забыл вернуть. могло от этого?

Добавлено через 2 минуты
easybudda, давай еще раз пробежимся по адресной арифметике? какой шаг? на размер указателя?
В двух словах, твое видение. Постараюсь понять.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
27.08.2011, 16:26     Как правильно? #8
Цитата Сообщение от AzaKendler Посмотреть сообщение
какой шаг? на размер указателя?
На размер типа указателя.
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
27.08.2011, 16:29  [ТС]     Как правильно? #9
silent_1991, ну от этого я и отталкиваюсь. следущий вопрос. как размер указателя привязан к размеру типа на который он указывает? Наприме размер инта 4 и размер его указателя 4? а размер MyObj - 16? Не проверял щас но каков размер указки в этом случае? следуя логике должен быть 16?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
27.08.2011, 16:32     Как правильно? #10
AzaKendler, вы в 16 строке выделяете память под один экземпляр класса A, и вызываете для него конструктор, которому передаёте size. В операторе [] вы обращаетесь за пределы выделенной памяти. Отсюда heap corruption.

Добавлено через 1 минуту
AzaKendler, никак не привязан. Указатель - это число, с помощью которого можно адресовать любую из ячеек памяти. Размер типа double равен 8, а указатель на него всё равно 4 (в общем случае, бывают колебания в зависимости от компилятора и ОС).
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
27.08.2011, 16:32  [ТС]     Как правильно? #11
silent_1991, да это тупая опечатка щас при наборе была. он так не создастся вообще конструктора нету по умолчанию
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
27.08.2011, 16:34     Как правильно? #12
Цитата Сообщение от AzaKendler Посмотреть сообщение
какой шаг? на размер указателя?
В двух словах, твое видение.
Видел в K&Р в главе 5.4
Если р есть указатель на некоторый элемент массива, то р++ увеличивает р так, чтобы он указывал на следующий элемент, а р += i увеличивает его, чтобы он указывал на i-тый элемент после того, на который указывал ранее...
Ну и далее по тексту...
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
27.08.2011, 16:36  [ТС]     Как правильно? #13
silent_1991, ну в любом случае спасибо. Это теория которую я знаю.Спасибо за подтверждение. Черт. Так и не понял почему был хип коррупшн

Добавлено через 1 минуту
Спасибо вам, silent_1991, easybuddaчто уделили внимание.
grizlik78
Эксперт С++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,960
27.08.2011, 16:41     Как правильно? #14
Цитата Сообщение от AzaKendler Посмотреть сообщение
Так и не понял почему был хип коррупшн
Если в коде осталось (top+sizeof(A)*i), то heap corruption никуда не делся.
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
27.08.2011, 16:49  [ТС]     Как правильно? #15
grizlik78, расскажи плиз. как и что. что не так?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
27.08.2011, 16:50     Как правильно? #16
AzaKendler, вот в догонку ещё пример
C
1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main(void){
    int arr[] = { 1, 2, 3, 4 };
    char * p = (char*)arr + 2 * sizeof(int);
    printf("%d\n", *((int*)p));
 
    return 0;
}
попробуйте угадать, что выведется, а потом скомпилируйте и проверьте...
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
27.08.2011, 17:03  [ТС]     Как правильно? #17
easybudda, прости не уловил. приводится к чару зачем то. Я только учусь. Тонкий пример хотя бы сам прокомментируй, не уловил

Добавлено через 8 минут
grizlik78,хип коррупшн вернулся. ты прав
grizlik78
Эксперт С++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,960
27.08.2011, 17:10     Как правильно? #18
sizeof(A) в той формуле абсолютно лишний. Именно из-за арифметики указателей.
Цитата Сообщение от AzaKendler Посмотреть сообщение
Это теория которую я знаю.
Выходит, что нет.
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
27.08.2011, 17:13  [ТС]     Как правильно? #19
grizlik78, а что конкретно. ткни носом. Двигаем на шаг равный размеру типа? Разве нет?

Добавлено через 40 секунд
Цитата Сообщение от grizlik78 Посмотреть сообщение
sizeof(A) в той формуле абсолютно лишний.
"кто за него?"
ладно я в гугл
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2011, 17:16     Как правильно?
Еще ссылки по теме:

C++ Как правильно использовать классы? Как вывести значение класса на экран?
Как правильно записывать условные операторы и как прервать проверку при достижении результата C++
Программа правильно сохраняет, но не правильно считывает матрицу из файла C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
27.08.2011, 17:16     Как правильно? #20
AzaKendler, да компилятор сам сдвинет на шаг, равный размеру типа. Ему явно этого указывать не нужно.
C++
1
2
3
int a[] = {1, 2, 3};
int *ptr_a = a;
ptr_a = ptr_a + 1; // компилятор сам сдвинет указатель на 4 байта, хотя мы указали 1
Yandex
Объявления
27.08.2011, 17:16     Как правильно?
Ответ Создать тему
Опции темы

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