Всем привет! Пытаюсь выполнить присвоение массива другому массиву по его указателю в конструкторе класса, но это не работает тк указатель показывает на 1ую ячейку памяти, думаю сделать присвоение через цикл, но вдруг я что то упускаю и можно присвоить массив другому массиву через его указатель. Ещё, вместо массива name[80]
был указатель типа char char *name;
, я думал можно будет обращаться к литералу через указатель переданный в конструкторе
Person::Person(const char *name, int const &age) {
*this->name = *name;
this->age = age;
}
, но у меня ничего не получилось тк Visual Studio говорил об ошибке доступа к памяти, я подумал что это связанно со стеком и при передаче параметров в конструктор после его завершение место в памяти под эти параметры удаляются. И так собственно мои вопросы: 1) Можно ли присвоить массив другому массиву без цикла for и использованием адресной арифметики? 2) Верна ли моя догадка со стеком, и освобождением памяти?
#include <iostream>
using namespace std;
class Person {
public:
Person(const char *name, int const &age);
char name[80];
int age;
void show();
};
Person::Person(const char *name, int const &age) {
this->name = *name;
this->age = age;
}
void Person::show() {
cout << "My name is: " << name << ". And I am is: " << age << endl;
}
template <class T> void reverse(T &a, T &b) {
T temp;
temp = a;
a = b;
b = temp;
}
int main() {
Person vasya("Vasya", 10);
Person misha("Misha", 20);
vasya.show();
misha.show();
return 0;
}
strcpy_s(this->name, name)
.
И поправьте во втором примере кода this->name = *name;
на *this->name = *name;
, ибо в первом случае Вы присваиваете адресу(указателю) первую букву строки, которую Вы передаете в конструктор. А так делать нельзя. Во втором же случае Вы присваиваете первый символ первого аргумента функции первой ячейки памяти массива name[], но я не уверен, что Вы хотели сделать именно это.*(name+index) = 's';
, где index
- число, которое вы передаете в конструктор. Причем надо помнить, что если Вы используете char* name, то перед тем, как что-то туда записывать, стоит выделить память в конструкторе и! не забыть её также удалить в деструкторе. В любом случае проблема не в стеке или чем-то ещё. Вы просто пытаетесь использовать участок памяти, которого не существует, либо к которому у Вас нет доступа.
А вообще лучше используйте std::string, так намного проще. И храните все данные класса в поле private
. Поле public
- это поле для интерфейса, т.е. Ваших функций. И не называйте параметры методов так же, как и члены класса.Виртуальный выделенный сервер (VDS) становится отличным выбором
Пишу простое консольное приложение При попытке скомпилировать проект линковщик выдает следующее: