更改指针的值会导致意外行为c ++

时间:2017-02-09 04:34:03

标签: c++ pointers

#include<iostream>
using namespace std;

int main( ) 
{   


int *p; 
double *q; 
cout << p << " " << q << endl;
p++; 
q++; 
cout << p << " " << q << endl;
//*p = 5; // should be wrong!

}

此功能打印

0x7ffe6c0591a0 0
0x7ffe6c0591a4 0x8

为什么p指向某个randm地址而q指向零?另外,当我取消注释行* p = 5时,不应该抛出错误?它仍然可以正常工作:

code with line uncommented output 
0x7ffc909a2f70 0
0x7ffc909a2f74 0x8

什么可以解释这种奇怪的行为?

3 个答案:

答案 0 :(得分:0)

由于您尚未初始化变量 - 代码将转换为未定义的行为。所以任何事情都可能发生,包括你所经历的事情。

C ++为您提供了足够的绳索来吊死自己。编译所有打开的警告,以避免一些危险。

答案 1 :(得分:0)

如果不启动变量,则会根据编译器策略将其设置为随机或特定值。 关于++如果你创建一个指向A类的指针,并使用++,指针将增加sizeof(A)。 关于你的最后一个问题,当你没有为p分配内存时,* p = 5是一个很好的未定义行为实例;

答案 2 :(得分:0)

当基本类型的本地(function newlinks($post_id){ $permaurl=get_permalink($post_id); $shorturl=make_my_url($permaurl); update_post_meta('$post_id','shorturl',$shorturl) } add_action( 'save_post', 'newlinks' ); function make_my_url($myurl) { //got te key from https://console.developers.google.com/iam-admin/projects $key = 'AIzBP0'; $googer = new GoogleURLAPI($key); // Test: Shorten a URL $shortDWName = $googer->shorten($myurl); return $shortDWName; // returns the short url } // Declare the class class GoogleUrlApi { // Constructor function GoogleURLAPI($key,$apiURL = 'https://www.googleapis.com/urlshortener/v1/url') { // Keep the API Url $this->apiURL = $apiURL.'?key='.$key; } // Shorten a URL function shorten($url) { // Send information along $response = $this->send($url); // Return the result return isset($response['id']) ? $response['id'] : false; } // Send information to Google function send($url,$shorten = true) { // Create cURL $ch = curl_init(); // If we're shortening a URL... if($shorten) { curl_setopt($ch,CURLOPT_URL,$this->apiURL); curl_setopt($ch,CURLOPT_POST,1); curl_setopt($ch,CURLOPT_POSTFIELDS,json_encode(array("longUrl"=>$url))); curl_setopt($ch,CURLOPT_HTTPHEADER,array("Content-Type: application/json")); } else { curl_setopt($ch,CURLOPT_URL,$this->apiURL.'&shortUrl='.$url); } curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); // Execute the post $result = curl_exec($ch); // Close the connection curl_close($ch); // Return the result return json_decode($result,true); } } )变量(autoint,指向它们的指针等)未初始化时,任何访问其值的操作都会产生未定义的行为。

打印变量会访问其值,因此带有double的语句都会给出未定义的行为。递增变量也会访问其值(不能在不访问前一个值的情况下给出递增的结果),因此两个递增运算符都呈现未定义的行为。取消引用一个单元化指针(如在cout << ...中)会给出未定义的行为,就像为结果*p赋值一样。

因此,在*p = 5p的定义之后显示的每个语句都会给出未定义的行为。

未定义的行为意味着对允许发生的事情没有任何限制 - 或者更简单地说,任何事情都可能发生。这允许来自&#34;的任何结果似乎什么都不做&#34;到&#34;崩溃&#34;到&#34;重新格式化您的硬盘&#34;。

因此,您获得的特定输出并不重要。使用不同的编译器构建代码时,或者甚至在月亮的不同阶段,您可能会遇到完全不同的行为。

就您所看到的内容的部分解释而言......变量qp可能会收到与创建它们的位置在内存中发生的任何内容相对应的值 - 因此,无论某些代码(在操作系统驱动程序内,在您的程序中,甚至在某些其他程序中)都碰巧先前在该位置写入。但这只是众多可能解释中的一种。