1. 程式人生 > >C/C++中字串常量為什麼可以賦值給char*?

C/C++中字串常量為什麼可以賦值給char*?

1、對於C來說,字串常量是由字元構成的陣列,比如“hello”型別為char[6],所以在C中可以直接字串常量賦值給char*。既然C中字串常量是是不是改變字串常量的值呢?答案是否定的,雖然可以編譯通過(會有警告),但是執行時會出錯。因為字串常量位於只讀儲存區不允許寫操作。實驗如下:

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

int main(int argc,char*argv[])
{
    printf("running \n");

    char *p = "hello";

    printf("%s\n", p);
    
    *p = "d";//改變p所指向的記憶體的值,即改變"hello",所以執行會出錯
    //p = "d";//只是改變了指標的指向,所以可以執行

    printf("%s\n", p);

    system("pause");
    return 0;
}

在vscode中編譯如下:

雖然出現了警告,但編譯成功了。

執行結果如下:

程式在執行到*p = "d"時停止了。

2、但是對於C++來說,字串常量是由常量字元構成的陣列。比如"hello"型別是const char[6]。一般來說,const char *是不能轉換成char *的,因為這樣會刪除底層const。但是這裡為了相容C程式碼做了特殊處理,所以允許將字元常量賦值給char*。

 

===》》》參考https://www.zhihu.com/question/20362192