程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> char* 指向內容不能修改的問題

char* 指向內容不能修改的問題

編輯:關於C語言

  char* str = "resource";

  str[6] = k;  //這句報內存寫入錯誤

  *(str+6) = k; //這樣寫同樣報錯

  但是這樣就沒問題:

  char* str = new char[12];

  strcpy(str, "resource");

  str[6] = k; //沒問題

  *(str+6) = k; //沒問題

  這樣也沒問題:

  char str[] = "resource";

  str[6] = k;

  *(str+6) = k;

  從網上搜尋資料後,找到了一個比較准確的解答:

  "resource"是字符串常量。

  對於 char *str = "resource";

  把"resource"的值----也就是字符串常量字面值,也就是"resource"的地址,准確來說是起始地址----賦給字符指針 str,Linux下,"resource"字符串常量是存放於只讀數據區的,一般來說,32位機器上,在Linux中,堆,全局數據,常量等都是存放於從0x8048000開始的內存地址,向上增長。可以打印一下"resource"的地址來進行驗證。char *str = "resource",就是把"resource"的首地址賦給str,所以str 存放的是一個只讀數據區的地址,對只讀區的數據進行寫操作是禁止,具體由相應的操作系統進行判斷以及處理。

  而對於 char str[] = "resource";

  str[]是一個字符數組,編譯器首先在棧中分配一定的連續空間用於存放“resource”中的字符以及結尾符,然後把字符串常量的內容,也就是

  "resource"中的各個字符和結尾符復制到這個棧中的連續空間中。str是數組名,用來表示這個連續棧空間的起始地址,所以str中存放的是棧地址,這個地址的數據是可寫的。一般來說,32位機器上,在Linux中,棧地址空間從3G(0xbfffffff)開始向下增長。

  可以用語句printf("%x ", str)來打印出str中存放的地址,來驗證一下這個地址屬於棧還是屬於只讀數據區。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved