[問題] 關於字串 assign 到指標或陣列的問題

看板C_and_CPP作者 (超人一號)時間14年前 (2009/09/30 00:54), 編輯推噓12(12023)
留言35則, 7人參與, 最新討論串1/2 (看更多)
下面程式 #include<stdio.h> #include<stdlib.h> int main(void){ struct person { int age; int high; char *name; }Mary; Mary.age=18; Mary.high=160; Mary.name="Super MAN"; printf("The age is %d and %d cm who's name is %s ",Mary.age ,Mary.high,Mary.name); system("pause"); return 0; } 這個OK 但為何 1. 把 struct 中間的 char *name 改為 char name[32] 就會錯誤 訊息為 incompatible types in assignment of `const char[10]' to `char[32]' 2. 改為 char name[32] 後 用 person Mary={18,160,"Super MAN"}; 就又行了? 謝謝回答 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.84.155.210 ※ 編輯: monkeyting 來自: 219.84.155.210 (09/30 00:54)

09/30 00:57, , 1F
1. 你那樣type不對 陣列不是這樣assign值
09/30 00:57, 1F

09/30 00:58, , 2F
2.那是struct 專有的初始化方式 跟1.是不一樣的
09/30 00:58, 2F

09/30 01:02, , 3F
因為assignment 和 initialization 是不一樣的
09/30 01:02, 3F

09/30 01:02, , 4F
不過...我突然發現為啥 char *name可以寫name="字串"??
09/30 01:02, 4F

09/30 01:03, , 5F
""不是應該要用const *去指嘛? 不過這樣可以compile也沒警告.
09/30 01:03, 5F

09/30 01:03, , 6F
陣列在一開始宣告就要assign 字串嗎?
09/30 01:03, 6F

09/30 01:03, , 7F
不一定 你當然可以用strcpy cat等指令去assign值
09/30 01:03, 7F

09/30 01:07, , 8F
謝謝 大概略懂為什麼了 肛溫蛤~
09/30 01:07, 8F

09/30 01:09, , 9F
char *name; name="...."是合法的啊, 就相當於指向一個
09/30 01:09, 9F

09/30 01:10, , 10F
const char string/array啊, 只是不能去modify指到的地
09/30 01:10, 10F

09/30 01:10, , 11F
方:)
09/30 01:10, 11F

09/30 01:12, , 12F
可是為什麼可以? const不是應該要const char*才能指過去嘛?
09/30 01:12, 12F

09/30 01:12, , 13F
我寫 const int* p[5]; int *ptr=p;這樣就不行~道理跟char
09/30 01:12, 13F

09/30 01:12, , 14F
不一樣嘛?
09/30 01:12, 14F

09/30 01:21, , 15F
const int p[5];啦XD 你把int換成char也同樣是不行啊:)
09/30 01:21, 15F

09/30 01:24, , 16F
沒記錯的話是存放的節區不同; 或許上面的推文裡用
09/30 01:24, 16F

09/30 01:25, , 17F
const char array是不正確的說法; 詳情還是等其他研究
09/30 01:25, 17F

09/30 01:25, , 18F
喔喔打錯 不過我是想表達..."型態不是const嘛??怎可用這樣指
09/30 01:25, 18F

09/30 01:25, , 19F
比較清楚完整的大大們來解釋吧:)
09/30 01:25, 19F

09/30 02:19, , 20F
印象中以前的 C 沒有 const ... 歷史包袱
09/30 02:19, 20F

09/30 02:20, , 21F
不留這個相容性很多老 code 會死
09/30 02:20, 21F

09/30 16:19, , 22F
char *p = "abc" 忘了是stack還是heap裡會多一塊"abc"
09/30 16:19, 22F

09/30 16:20, , 23F
所以你去assaign不會有問題
09/30 16:20, 23F

09/30 16:22, , 24F
const沒記錯只是compile的宣告...沒有const memory這東西
09/30 16:22, 24F

09/30 16:32, , 25F
"這塊不是配在text segment嘛" 而且他type也說是const char *
09/30 16:32, 25F

09/30 16:36, , 26F
l大 所以說 不用const char *=""可以過 是因為相容性不得已嘛
09/30 16:36, 26F

09/30 18:06, , 27F
string constant("字串常數")是const char array沒錯
09/30 18:06, 27F

09/30 18:06, , 28F
之所以可以把一個const char array assign給char *
09/30 18:06, 28F

09/30 18:07, , 29F
純粹是歷史因素...我記得gcc會給warning
09/30 18:07, 29F

09/30 18:08, , 30F
deprecated conversion from string constant to char *
09/30 18:08, 30F

09/30 18:11, , 31F
噫 我手邊的gcc不會出現warning...
09/30 18:11, 31F

09/30 18:14, , 32F
g++ :P 打錯了
09/30 18:14, 32F

09/30 18:15, , 33F
我記得是存放在stack裡 所以如果有太大量的明碼string
09/30 18:15, 33F

09/30 18:16, , 34F
可能會塞爆STACK 詳細可能要去K COMPILER了 orz
09/30 18:16, 34F

09/30 18:17, , 35F
string constant存在data segment.
09/30 18:17, 35F
文章代碼(AID): #1AmZksP- (C_and_CPP)
文章代碼(AID): #1AmZksP- (C_and_CPP)