#include<iostream>
using namespace std;
char* function1()
{
char* var = new char;
var[0] = 'q';
var[1] = 'p';
return var;
}
int* function2()
{
int* var = new int;
var[0] = 12;
var[1] = 20;
return var;
}
int main() {
cout << function1() << endl;
cout << function2() << endl;
// your code goes here
return 0;
}
Выход:некоторые разъяснения по программе ниже
qp
0x9cf9018
Есть некоторые сомнения в этой программе. Любое обсуждение будет очень полезно для понимания вещей.
1. char* var = new char;
Согласно моему пониманию до сих пор, это утверждение говорит: Дайте мне адрес ячейки памяти, где я могу хранить символ. поэтому компилятор будет выделять один байт памяти. Тогда почему мы можем хранить любое количество символов:
var[0] = 'q';
var[1] = 'p';
var[1] = 'r';
Если ответ из-за непрерывную область памяти, мы можем получить доступ к следующей памяти, то мы не обращаемся то, что не дан нам. а также неосознанно переписывать то, что принадлежит другим. Если ответ снова «ДА», то почему компилятор позволяет нам это делать. и как этого избежать. Также, если мы не избегаем этой вещи, можем ли мы получить некоторые неожиданные результаты при многократном запуске программы?
2. The answered behavior of above point is same for int* var = new int; and char* var = new char, or is different. And if is different, what is the difference?
3. why one cout is printing value, while other printing address?
Функция1 записывает конец конца выделенного пространства. function2 также – usr
Каждая из этих функций демонстрирует ** неопределенное поведение **. Вы получаете доступ (и в данном случае к записи) к памяти за пределами диапазона распределения. – WhozCraig