我很困惑。在閱讀this和this爲什麼命令行參數聲明導致分段錯誤
我決定給它一個嘗試,所以我坐下來寫一個看起來像這樣的
#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[])
後,我成功運行的代碼不命令行申報的習慣第一次。 (這讓我很驚訝)。我添加了命令行參數聲明。
但是,這次運行相同的代碼。導致分割錯誤。
問題:那麼爲什麼這種區別,代碼工作沒有命令行參數,但與命令行參數聲明斷開。
這些問題是完全無關的。挑一個,或將它們分成不同的問題。 – rici
一個提示:'int * ptr = y'與'int ptr;'相同,後跟(1)'ptr = y;'或(2)'* ptr = y;'?這兩項任務有什麼區別? – rici
當ptr指針未初始化時,'* ptr = 65'是一個未定義的行爲。你的問題最好的部分是試圖定義未定義的,這是完全沒有意義的。 – Ari0nhh