2015-02-23 64 views
2
#include <stdio.h> 
#include <stdint.h> 
int p() 
{ 
    char data[7]="Hello!\0"; 
    uint64_t *ptr=((uint64_t)data + 0x18); 
    printf("%s",data); 
    (*ptr)-=10; 
    return 0x00; 
} 

int main(int argc,char **argv) 
{ 
    p(); 
} 
+0

什麼循環?你的意思是它永遠掛起? – 2015-02-23 12:18:05

+1

你有*兩個*問題,都導致[*未定義行爲*](http://en.wikipedia.org/wiki/Undefined_behavior)。實際上,他們都是同樣的問題,但以兩種不同的方式表達。問題是你正在寫兩個*位置的'data'數組的邊界。 – 2015-02-23 12:19:56

+0

而且,鑄造'(unit64_t)數據'?這是什麼意思? – 2015-02-23 12:21:04

回答

1

你有什麼是未定義的行爲。

char data[7]="Hello!\0"; 

寫入到陣列出界導致未定義behavior.This是不爲空終止string.You可以選擇的選項下面一個正確的方式。

將其更改爲

char data[7]="Hello!"; 

,你甚至可以有

char data[]="Hello!"; 

編輯:

通過這樣做

uint64_t *ptr=((uint64_t)data + 0x18); 

你快把你的指針指向哪個不是由you.Later分配一些內存位置,您嘗試寫入到這個位置

(*ptr)-=10; 

所以訪問數組越界或寫入到不是由你分配一些內存導致未定義的行爲。您需要先解決它們

+1

甚至更​​好,把它留給編譯器,'char data [] =「Hello!」;' – 2015-02-23 12:23:12

+0

@SouravGhosh是的,我會採取的。 – Gopi 2015-02-23 12:23:32

+0

你能解釋一下這個數組是如何走出界限的嗎? – 2015-02-23 12:25:19

2

正如在其他答案和評論中提到的寫作char data[7]="Hello!\0";可能是一個問題,但我不認爲這是問題的唯一來源。

我的猜測是: uint64_t *ptr=((uint64_t)data + 0x18);

(*ptr)-=10; 通過從堆棧這樣做可能要修改寄信人地址或做類似的東西。