#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
什么可以解释这种奇怪的行为?
答案 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);
}
}
)变量(auto
,int
,指向它们的指针等)未初始化时,任何访问其值的操作都会产生未定义的行为。
打印变量会访问其值,因此带有double
的语句都会给出未定义的行为。递增变量也会访问其值(不能在不访问前一个值的情况下给出递增的结果),因此两个递增运算符都呈现未定义的行为。取消引用一个单元化指针(如在cout << ...
中)会给出未定义的行为,就像为结果*p
赋值一样。
因此,在*p = 5
和p
的定义之后显示的每个语句都会给出未定义的行为。
未定义的行为意味着对允许发生的事情没有任何限制 - 或者更简单地说,任何事情都可能发生。这允许来自&#34;的任何结果似乎什么都不做&#34;到&#34;崩溃&#34;到&#34;重新格式化您的硬盘&#34;。
因此,您获得的特定输出并不重要。使用不同的编译器构建代码时,或者甚至在月亮的不同阶段,您可能会遇到完全不同的行为。
就您所看到的内容的部分解释而言......变量q
和p
可能会收到与创建它们的位置在内存中发生的任何内容相对应的值 - 因此,无论某些代码(在操作系统驱动程序内,在您的程序中,甚至在某些其他程序中)都碰巧先前在该位置写入。但这只是众多可能解释中的一种。