为什么递增指针会给出一个与存储器地址相对的随机数?

时间:2017-01-24 05:54:03

标签: c++ pointers

为什么当我递增指针然后取消引用它时,我得到一个随机数?

这是我的代码:

 #include <iostream>

 using namespace std;

 int main(){
     int reference = 10;
     int *health = &reference;
     int *health1 = health;
     cout << "Health Address: " << health <<
        "\nHealth1 Address: " << health1 <<
        "\nReference Address: " << &reference << endl;
     health1++;
     cout << "Health1 value after being incremented then dereferenced: " << *health1 << endl;     
  }

我的输出是:

  

健康地址:0x7fff5e930a9c

     

Health1地址:0x7fff5e930a9c

     

参考地址:0x7fff5e930a9c。

     

增加后的Health1值然后解除引用:197262882

我期望得到一个0,因为下一个内存地址的下一个值将为null,但在这种情况下情况并非如此。

5 个答案:

答案 0 :(得分:6)

  

由于内存中的下一个位置为空,我原本期望得到0,但在这种情况下情况并非如此。

你的期望是错误的。增加指针后,它不再指向有效的内存缓冲区。取消引用它会调用未定义的行为。

答案 1 :(得分:3)

增加指针后,它指向程序未分配和初始化的内存,因此它不是您所期望的那样。 每次运行程序时,都可能得到一个随机整数。

答案 2 :(得分:2)

我认为您的误解来自于您希望指针指向数组的下一个元素的地址:

int myarray[] = { 1, 2, 3, 4, 5 };
int* parray = myarray;
std::cout << *parray << std::endl;
parray++; // increment the pointer, now points at the address of number 2
std::cout << *parray << std::endl;

但是由于示例中有无数组,增量指针指向下一个内存块。它指向的类型的字节大小被添加到指针。任何人的猜测都有什么价值:

int myvalue = 10;
int* mypointer = &myvalue;
mypointer++;

取消引用此类指针是未定义的行为。超过分配给进程的内存时,您将无法获得指针空值或取消引用的值0

答案 3 :(得分:0)

假设X是指针T *p;的值。

如果p递增,则p将指向地址X + sizeof(T)

然后

*p将为您提供存储在地址X + sizeof(T)的值。现在,根据地址X + sizeof(T)的有效性,如果X + sizeof(T)无效,您将获得可能是未定义行为的结果。

答案 4 :(得分:0)

import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.Utils import COMMASPACE, formatdate
from email import Encoders
import os
import datetime


smtpUser = ' '
smtpPass = ' '

toAdd = ' '
fromAdd = smtpUser

today = datetime.date.today()

subject  = 'Data File 01 %s' % today.strftime('%Y %b %d')
header = 'To :' + toAdd + '\n' + 'From : ' + fromAdd + '\n' + 'Subject : ' + subject + '\n'
body = 'This is a data file on %s' % today.strftime('%Y %b %d')

attach = 'Data on %s.csv' % today.strftime('%Y-%m-%d')

print header


def sendMail(to, subject, text, files=[]):
    assert type(to)==list
    assert type(files)==list

    msg = MIMEMultipart()
    msg['From'] = smtpUser
    msg['To'] = COMMASPACE.join(to)
    msg['Date'] = formatdate(localtime=True)
    msg['Subject'] = subject

    msg.attach( MIMEText(text) )

    for file in files:
        part = MIMEBase('application', "octet-stream")
        part.set_payload( open(file,"rb").read() )
        Encoders.encode_base64(part)
        part.add_header('Content-Disposition', 'attachment; filename="%s"'
                       % os.path.basename(file))
        msg.attach(part)

    server = smtplib.SMTP('smtp.gmail.com:587')
    server.ehlo_or_helo_if_needed()
    server.starttls()
    server.ehlo_or_helo_if_needed()
    server.login(smtpUser,smtpPass)
    server.sendmail(smtpUser, to, msg.as_string())

    print 'Done'

    server.quit()


sendMail( [toAdd], subject, body, [attach] )

你需要取消引用指针,因为这会增加地址本身而不是它指向的值。