2017-03-07 105 views
0

我很困惑。在閱讀thisthis爲什麼命令行參數聲明導致分段錯誤

我決定給它一個嘗試,所以我坐下來寫一個看起來像這樣的

#include <stdio.h> 
int main() 
{ 

    int *ptr; 
    printf("%p\n:",ptr); 
    *ptr = 65; 
    printf("PTR : \n \t VALUE: %d\n \t ADDRESS: %p\n",*ptr,ptr); 
    return 0; 
} 

香草代碼和它的工作。

0x7fff50ba0500 
:PTR : 
    VALUE: 65 
    ADDRESS: 0x7fff50ba0500 

現在,我有幾個問題(確切地說是3)。

問題1:

我知道int *ptr未在上面的步驟初始化。其中一種方法是使用。

int *ptr = malloc(sizeof(int)); 
*ptr = 65 

    or 
int b = 65; 
int *ptr; 
ptr = &b; // or simply int *ptr = &b; 

但與char指針不同,它不能直接賦值。在字符指針世界

char *name = "apple"; 
    or 
    char *name; 
    name = "viren"; 

例子是一個有效的聲明,但下面是不正確的另一個例子

int *ptr = 65; // not valid, since ptr should point to address. 

這個原因作出任何解釋?

問題2

正如在其他堆棧溢出回答

*ptr = 65; 

一提的是不好的,因爲PTR必須指向一個地址。在上述情況下,它會指向0x41地址(如果轉換爲十六進制是正確的),因此該代碼將導致segmentation fault

問那麼爲什麼上面的代碼休息,導致Segmentation Fault

問題3: 我沒有寫在命令行參數聲明即

int main(int argc,char *argv[]) 

後,我成功運行的代碼命令行申報的習慣第一次。 (這讓我很驚訝)。我添加了命令行參數聲明。

但是,這次運行相同的代碼。導致分割錯誤。

問題:那麼爲什麼這種區別,代碼工作沒有命令行參數,但與命令行參數聲明斷開。

+1

這些問題是完全無關的。挑一個,或將它們分成不同的問題。 – rici

+0

一個提示:'int * ptr = y'與'int ptr;'相同,後跟(1)'ptr = y;'或(2)'* ptr = y;'?這兩項任務有什麼區別? – rici

+1

當ptr指針未初始化時,'* ptr = 65'是一個未定義的行爲。你的問題最好的部分是試圖定義未定義的,這是完全沒有意義的。 – Ari0nhh

回答

2

答1

當你做char *name = "apple";,你指定name是一個字符指針指向一個字符串對象「蘋果」。在C中,字符串文字存儲在內存的特殊(只讀)部分。因此name在這裏指向存儲文字「apple」的那部分內存。

但是,整型或浮點型文本通常是機器指令的一部分,不會單獨存儲在內存中。因此,您的陳述int * p = 65變得無效,因爲整數字面值65沒有單獨存儲在內存中,因此沒有int指針可指向的地址。

答2

你的理解是不完全正確的。語句*ptr = 65指示65的int值應存儲在ptr指向的地址處。在你的情況下,由於你沒有用可寫內存初始化ptr,它會引發分段錯誤。

答3

指定參數給main功能不應該有什麼關係,你所看到的分段錯誤。將值分配給未初始化的指針的行爲是不可預知的。它可能會引發分段錯誤,或者它可能不取決於它最終寫入的內存位置是否可寫。

相關問題