2011-04-05 90 views
5

我正嘗試在我的程序中創建一個指向main()參數之一的指針。 我設置了初始指針,然後將其設置爲等於數組中的第二個元素,但是當我嘗試編譯時發生錯誤,分段錯誤。這是否因爲指針指向錯誤的地址而發生?從main()參數中提取字符串

下面是代碼:

char *filename; 
*filename = argv[1]; 
printf("The filename is: %s", *filename); 

我得到的指針錯誤嘗試投放參數爲int。這是因爲指針實際上是一個整數地址值,我試圖設置它等於一個字符串?

編輯:當我改變到「文件名= argv的[1]」,然後從我的編譯器得到以下錯誤:分配丟棄了指針目標類型的限定。

回答

7

編譯時可能不會發生分段錯誤。除非編譯器違反內存安全性,否則不太可能。我會認爲它在您運行該程序時發生:D。

的問題是在這裏:

*filename = argv[1]; 

它應該是:

filename = argv[1]; 

爲什麼?你宣佈一個指向char的單元化,特別是無處可逃。然後,你指向取消引用那個指針並將數據分配給那個內存位置。這是誰知道在哪裏!

編輯:你還提領filenameprintf()通話。刪除那* :)。

此外,didnt」編譯器拍攝警告,當你指定*文件名?從指針沒有演員製作整數,將是我的猜測? 注意警告,他們提供有用的信息!

乾杯。

+1

同樣'的printf( 「文件名是:%S」,文件名);'。 '%s'說明符需要一個字符*指針*。 – dmckee 2011-04-05 23:26:29

+0

當我更改爲「文件名= argv [1]」,然後從我的編譯器中得到以下錯誤:賦值放棄指針目標類型的限定符。 – Kelp 2011-04-05 23:46:31

+1

@Kelp:用main int(int argc,char ** argv)或int main(int argc,char * argv [])'定義main。 – pmg 2011-04-05 23:59:05

3

在語句*filename = argv[1];中,表達式*filename嘗試取消引用(找到指向的值)filename指針,該指針尚未指向任何有意義的地方。

分配更改爲filename = argv[1]

4

你沒有將filename指向同一個地方作爲argv[1]。要做到這一點,你需要

filename = argv[1]; 

隨着您的版本(*filename = argv[1];)你想做出力所能及的文件名點有一個是argv中值[1]。這裏有很多錯誤的地方:a)文件名不被初始化,並且可以指向任何地方,甚至無效位置; b)argv[1]的類型爲char*,您正試圖將其放入類型爲char的位置!

0

你提領該字符*當你嘗試分配它,所以你要東西的指針到一個char。並且由於文件名是未初始化的,所以你試圖命中一些隨機地址(或者地址0x00000000。而你的打印語句,如果你有這麼多,也不會工作:你再次解引用char *(得到一個字符),然後告訴printf將它解釋爲一個指向nul結尾字符串的指針。

嘗試這種情況:

char *filename ; 
filename = argv[1] ; 
printf("The filename is: %s" , filename) ;