Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/29: Рейтинг темы: голосов - 29, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 29

Присвоить NULL массиву

16.10.2013, 09:25. Показов 6276. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Есть код:
C++
1
2
matrix();
clear();
В классе matrix объявлен указатель
C++
1
 unsigned char* data;
.
В конструкторе matrix() есть строка data = NULL;

Когда захожу в функцию clear, data уже не равен нулю! Дебаггер показывает, что он указывает на значение 0'', имеет ненулевой адрес!

Подскажите, пожалуйста, в чем дело?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.10.2013, 09:25
Ответы с готовыми решениями:

Присвоить значения массиву символов
простейший вопрос, но где-то ошибся... char TestArr; TestArr = { +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, + } ; //...

Как присвоить массиву значение суммы?
Вычислить сумму элементов матрицы по столбцам . Найти наименьшую сумму. #include <iostream> #include <math.h> using...

Как присвоить значение вектора string массиву?
Есть вектор строк string. В одном элементе вектора точно не больше 100 символов. Нужно разделить элемент вектора по символам массива. ...

11
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
16.10.2013, 10:01
может быть Вы ему значение присваиваете между вызовами Matrix() и Clear()
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
16.10.2013, 10:49
Цитата Сообщение от antake Посмотреть сообщение
имеет ненулевой адрес
Нууу тут не все так просто. Если в си без плюсов можно было присваивать указатель на void любому указателю, то в плюсах нельзя. Плюсовой компилятор сам подставит на свой вкус значение этому макросу. В лучшем случае ноль.
NULL

С вики: NULL - прям первый абзац.

А решение:
C++
1
nullptr
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
16.10.2013, 11:09
А каким образом связан конструктор matrix и функция clear ? Мне отчего-то кажется, что здесь простое непонимание происходящего....
antake, ты не мог бы привести минимальный пример кода, воспроизводящего проблему?
0
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 29
16.10.2013, 11:18  [ТС]
Да, конечно:

C++
1
2
3
4
5
6
7
        // Default constructor
        template<typename T> matrix<T>::matrix ()
        {
            data = NULL;
            rows = 0;
            columns = 0;
        }
C++
1
2
3
4
5
6
        template<typename T> matrix<T>::matrix (const shared_ptr<Mat> X)
        {   
            matrix<T>();
            setMatrix( X );
 
        }
C++
1
2
3
4
5
6
7
8
9
10
11
12
template<typename T> void matrix<T>::setMatrix( const shared_ptr<Mat> mat )
        {
            clear();
                      .........
                 }
        template<typename T> void matrix<T>::clear()
        {
                delete[] data;
                data = NULL; // it doesn't work..., see function setMatrix
                rows = 0;
                columns = 0;
        }
Добавлено через 2 минуты
Спасибо за ответы, я подозреваю, что действительно проблема в макросе NULL ( который у меня объявлен как 0), но пока другим занят, не проверил.

data становится ненулевой уже после выхода из дефолтного конструктора
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
16.10.2013, 11:21
Цитата Сообщение от antake Посмотреть сообщение
data становится ненулевой
Суть не в том, чтобы сделать ее именно непременно нулевой, а только в том, чтобы она больше не указывала ни на один объект.

А с nullptr что дебаггер говорит?
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
16.10.2013, 11:54
А не очень даже важно, что он говорит. Дело не в NULL и не в nullptr.

Дело вот в этом коде:
C++
1
2
3
4
5
6
        template<typename T> matrix<T>::matrix (const shared_ptr<Mat> X)
        {   
            matrix<T>();
            setMatrix( X );
 
        }
antake, ты думаешь, после выполнения строки matrix<T>(); у тебя будет data == NULL ? Нет. Потому что matrix<T>(); - это создание безымянного объекта типа matrix<T> ! И этот безымянный объект не имеет никакого отношения к тому объекту, для которого потом будет вызван setMatrix.... Разумеется, поэтому и data содержит мусор.

Тебе нужен немного другой синтаксис, доступный в C++11 (но не в более раннем C++03!):
C++
1
2
3
4
5
6
        template<typename T> matrix<T>::matrix (const shared_ptr<Mat> X):
            matrix<T>()
        {   
            setMatrix( X );
 
        }
1
249 / 219 / 63
Регистрация: 30.07.2013
Сообщений: 465
16.10.2013, 11:56
NULL, конечно, может и не быть нулем, но вероятность этого (на форуме С++ для начинающих) ничтожна.
Меня другое забавляет. Вот в этом некоем подобии копирующего конструктора
C++
1
2
3
4
5
template<typename T> matrix<T>::matrix (const shared_ptr<Mat> X)
{   
    matrix<T>();
    setMatrix( X );
}
создается временный объект maxtrix<T>(). А поле data собственно создаваемого объекта никто не обнуляет. Так с чего бы ему быть NULL'ом?
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.10.2013, 12:02
Цитата Сообщение от antake Посмотреть сообщение
data становится ненулевой уже после выхода из дефолтного конструктора
правильно ли я понял:
C++
1
2
matrix<int> m;
cout << m.data << endl; // выведет отличное от 0 значение?
Добавлено через 3 минуты
P.S. похоже ТС запутался с конструкторами.
Цитата Сообщение от CheshireCat Посмотреть сообщение
Тебе нужен немного другой синтаксис, доступный в C++11 (но не в более раннем C++03!):
Придется обойтись функцией инициализации тогда.
1
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 29
16.10.2013, 12:04  [ТС]
ААА, спасибо!)

даже стыдно немного стало)
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
16.10.2013, 12:10
Он может вывести все, что угодно. Разыменование NULL-указателя - это UB по Стандарту.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.10.2013, 12:29
Цитата Сообщение от CheshireCat Посмотреть сообщение
Он может вывести все, что угодно. Разыменование NULL-указателя - это UB по Стандарту.
Если это ответ на моё сообщение, то разыменования не происходит, мы просто выводим адрес.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.10.2013, 12:29
Помогаю со студенческими работами здесь

Не получается присвоить значение двумерному массиву char
объявляю двумерный массив (массив массивов в char для хранения имен файлов) в cpp файле char m_fname ; я хочу инициализировать...

Как присвоить двумерному символьному массиву значение?
Проблема в строке 18. Как будет правильно? #include &lt;cstdio&gt; int main() { char buf; int i,j,N,time,t,k,buftime,m; ...

Как заполненному одномерному массиву присвоить дополнительное имя?
Здравствуйте, не могли бы вы подсказать, как заполненному одномерному массиву присвоить дополнительное имя. //пример: массив...

Как присвоить массиву Char строку TextBox->Text ?
Как сделать ?

Как правильно массиву объектов присвоить ссылки на объекты.
TPoint Point,*p_Point; p_Point = Point; TPoint Mass; for (i=0; i&lt;10; i++) { Mass = p_Point; //вот не задвоятся ли у меня...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru