2011-05-23 63 views
1

用我的編譯器(蘋果LLVM-GG-4.2)以下代碼:爲const char *指針運算警告

void fun1(const char *s) 
{ 
    char* t = s+1; 
} 
void fun2(char *s) 
{ 
    char* t = s+1; 
} 

int main(void) 
{ 
    char* a; 
    fun1(a); 
    fun2(a); 
} 

給出了這樣的警告:

junk.c:3:警告:初始化從丟棄預選賽指針目標類型

on fun1但不在fun2上。爲什麼?

+3

因爲你失去了func1 – forsvarir 2011-05-23 18:42:57

回答

4

fun1正在接受const char *並被分配給char *
fun2正在接受一個char *並被分配給char *,這很好。

If you are assigning a constant pointer to a non-const pointer, this means you can modify the const pointer by using the const pointer

在這種情況下,裏面FUN1如果你t[0] = 'a'它不是合法的,因爲要修改常量的內存,這也就是爲什麼編譯器會發出警告

+0

Thx,Mayank和其他的const位。它現在非常有意義。 – grok12 2011-05-23 19:10:21

3

fun1sconst char *。當您執行char* t = s+1;時,您從s中「移除」const狀態。因此「丟棄限定符」。如果這是C++,你會得到一個編譯器錯誤而不是警告。

3

之所以在fun1之所以要將const char *轉換爲char *。這正在失去const修飾符,並打開了修改可能不打算修改該功能的數據的大門。

要解決這一變化的fun1身體

const char* t = s+1; 
+0

Thx,Jared,指出了這個問題。 – grok12 2011-05-25 05:26:03

1

您正在嘗試一個const指針賦給一個非const的指針。如果你在fun1()中使用「const char *」,那就沒問題了。