2013-10-27 3 views
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

Функция1 записывает конец конца выделенного пространства. function2 также – usr

+1

Каждая из этих функций демонстрирует ** неопределенное поведение **. Вы получаете доступ (и в данном случае к записи) к памяти за пределами диапазона распределения. – WhozCraig

ответ

1

1 символ * переменная = новый символ;

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

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

см выше

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

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

0

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

+0

Спасибо за ответ. Но здесь я не передаю указатель на строку. Его указатель на символ. Также, если компилятор принимает это строку, кто и как NULL присоединяется к нему? –

+0

@DeveshAgrawal _ «who & how NULL ..» _ Его UB, никакое обоснование не может быть дано. Как я уже сказал, вы были напуганы, чтобы получить этот результат. Обычно он должен просто отображать q с некоторыми значениями мусора, пока не найдет нулевой символ, где-то в памяти – P0W

+0

указатель на строку == указатель на первый элемент массива символов. и, как указывал P0W, вам повезло, поскольку после qp появился нулевой символ. обычно поведение не определено. когда-нибудь он будет печатать мусор, и в большинстве случаев это приведет к сбою с ошибкой сегментации. И в большинстве случаев куча коррупции приведет к совершенно странному поведению, например, к процессу, занимающему слишком большое пространство или просто к сбою. эти типы вещей очень трудно отлаживать и обычно приводят к отладке кошмаров. – madrag

Смежные вопросы