为什么当我递增指针然后取消引用它时,我得到一个随机数?
这是我的代码:
#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,但在这种情况下情况并非如此。
答案 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] )
你需要取消引用指针,因为这会增加地址本身而不是它指向的值。