2013-06-13 78 views
1

在C,這些語句:關於初始化指針變量

char *c={'q','w'}; 

int *c=123; 

都給出錯誤/對,最初 c將持有任何垃圾價值的事實,並通過分配值警告直接訪問該變量,我可能正在訪問受保護的內存。

但是,當我定義指針它不考慮它作爲字符串給出任何錯誤:

char *c="jayesh"; 

我沒能找出邏輯列定義後面。請幫助我理解相同。

警告其中我得到:

警告:在標量初始化多餘元素[默認啓用]
警告:初始化時將整數指針,未作施放[默認啓用]

+0

你應該給出你得到的警告。 –

回答

2
char *c={'q','w'}; 

不起作用,因爲c不是一個數組,你不能非數組對象使用數組初始化程序語法。

char *c=123; 

因爲你試圖將一個整數值(123)轉換爲不進行強制轉換的指針不起作用;注意在這個意義上,初始化將接替該

char *c = (char *) 123; 

會「工作」,雖然123是最有可能不是一個有效的內存地址。

char *c = "jayesh"; 

作品因爲字符串文字等"jayesh"是數組表達式,並且在多數情況下一個數組表達式將被轉換爲指針表達式,表達式的值將是該陣列的第一個元素的地址。此規則的例外情況是數組表達式是sizeof或一元運算符&的操作數,或者是用於在聲明中初始化另一個數組的字符串文字。

所以發生的是第一個字符的地址('j')被分配給c

如果你的宣言已經

char c[] = "jayesh"; 

然後c將被創建爲char 7個元素的數組,而*內容*字符串字面量將被複制到它。

1

int *c存儲地址的整數變量,但不是整數值。這就是爲什麼你會得到一個錯誤/警告。

char *c={'q','w'}在c中是一個無效的初始化。因爲指針可以指向一塊分配的內存。但是這種方式沒有爲{'q','w'}本身分配內存。

如果你願意,你可以使用

  `char *c=(char[]){'q','w'}` 

因爲,在這樣沒有無效初始化因爲{'q','w'}型轉化爲char[]可以通過c指出完成。

同意與你的字符* C的答案,但通過指定的char * C = 「周杰倫」 這裏也是我定義的數組爲c = { 'J', 'A', 'Y',」 \ 0' }有啥這兩個之間除外的 根本區別‘\ 0’

因爲,中{'w','q'}類型下不了決心char[],當您使用char *p={'q','w'};。但是當您使用char *p="hello"時,​​的類型解析爲char array。這就是C language如何定義string literals他們是字符流,但不是int或任何其他的流。

編譯時,每個這樣的字符串文字都存儲在靜態存儲位置,並且完全是char array,因此可以用c指向,它的類型爲char *。但是這與{}語法不同。因爲{'q','w'}可以是一個整數數組,也可以先將其轉換爲char [],那麼它如何被賦值爲char * ?例如,int p[]={'1','2'}編譯得很好。由於指針運算受其受type s size影響的類型的影響。{'1','2'}需要2*sizeof(int)如果它是int數組,並且2*sizeof(char)如果它是char數組。

+0

同意你對char * c的回答,但是通過在這裏指定char * c =「jay」,我也定義了一個數組作爲c = {'j','a','y','\ 0'}所以whats兩者之間的基本區別除了'\ 0'。 –

+0

看到編輯..... – pinkpanther

+0

得到了大部分的東西,但糾正我,如果我錯了。通過做char * c =(char []){'q','w'}我分配的地址' q'到c(它是指針變量),並在前面的表達式「char * c = {'q','w'}」c變量正在等待一個地址,但我正在爲它分配一個數組。 –

0

指向用於確定char數組的類型的大多數指針。準確地說,數組 - 這是一個指針/偏移量。當您創建變量char *ch時,這相當於char ch[],但您無法定義變量。您必須爲陣列指定一個固定大小。 char ch[256],這是C字符串。假設你已經創建了一個變量並且寫入字符串char ch[256] = "qwerty";你可以引用任何字符。 ch[2](他們返回「e」)。在這種情況下,ch是一個指向數組開始的指針。並且ch[2]將偏移量設置爲char的2個字節大小。

+0

char ch [] =「qwerty」也會起作用如果我在聲明點定義了字符串,我不需要聲明大小。 –