Как присвоить массив, массиву через его указтель?

123
23 ноября 2020, 05:40

Всем привет! Пытаюсь выполнить присвоение массива другому массиву по его указателю в конструкторе класса, но это не работает тк указатель показывает на 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;
}
Answer 1
  1. Если Вы не хотите использовать циклы, и Вам надо присвоить(скопировать один массив в другой), используйте strcpy_s(this->name, name). И поправьте во втором примере кода this->name = *name; на *this->name = *name;, ибо в первом случае Вы присваиваете адресу(указателю) первую букву строки, которую Вы передаете в конструктор. А так делать нельзя. Во втором же случае Вы присваиваете первый символ первого аргумента функции первой ячейки памяти массива name[], но я не уверен, что Вы хотели сделать именно это.
  2. Не очень понятно, что именно Вы имели в виду, как Вы передавали указатель, что это значит? Если вы хотели обращаться к какому-нибудь символу в строке через указательную арифметику, то Вам не указатель нужен, а обычное число. Например: *(name+index) = 's'; , где index - число, которое вы передаете в конструктор. Причем надо помнить, что если Вы используете char* name, то перед тем, как что-то туда записывать, стоит выделить память в конструкторе и! не забыть её также удалить в деструкторе. В любом случае проблема не в стеке или чем-то ещё. Вы просто пытаетесь использовать участок памяти, которого не существует, либо к которому у Вас нет доступа. А вообще лучше используйте std::string, так намного проще. И храните все данные класса в поле private. Поле public - это поле для интерфейса, т.е. Ваших функций. И не называйте параметры методов так же, как и члены класса.
READ ALSO
Вызов функции с помощью времени

Вызов функции с помощью времени

Как сделать вызов функции foo с помощью времени?

130
ошибки линковщика

ошибки линковщика

Пишу простое консольное приложение При попытке скомпилировать проект линковщик выдает следующее:

87