некоторые пояснения к приведенной ниже программе

0
#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
    function1 записывает после конца выделенного пространства. функция2
  • 1
    Каждая из этих функций демонстрирует неопределенное поведение . Вы обращаетесь (и в данном случае к записи) к памяти за пределами вашего диапазона выделения.
Теги:
pointers
int
char

2 ответа

1

1 char * var = new char;

Ваше понимание верное. Код настоятельно пытается вставить символы в другое место, которые вызывают UB (неопределенное поведение)

2 Ответное поведение выше...

См. Выше

3 почему один cout имеет значение печати, а другой адрес печати?

Опять UB, для первого вам не повезло получить ожидаемый результат

0

Поскольку вопросы 1 и 2 уже отвечал P0W, ответ на вопрос 3 заключается в том, что когда вы передаете указатель на строку с завершающим нулем в cout, она печатает строку.

  • 0
    Спасибо за ответ. Но здесь я не передаю указатель на строку. Его указатель на символ. Кроме того, если компилятор предполагает, что это строка, кто и как NULL добавляется к нему ??
  • 0
    @DeveshAgrawal "кто и как NULL .." Его UB, никакое оправдание не может быть дано. Как я уже говорил, вам не повезло получить этот результат. Обычно он должен просто отображать q с некоторыми значениями мусора, пока не найдет нулевой символ, где-то в памяти
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню