C_and_CPP 板


LINE

增加VLA跟std::array/std::vector的部份... =============================================================== 03. 你不可以提取(dereference)不知指向何方的指标(包含 null 指标)。 错误例子: char *pc1; /* 未给予初值,不知指向何方 */ char *pc2 = NULL; /* pc2 起始化为 null pointer */ *pc1 = 'a'; /* 将 'a' 写到不知何方,错误 */ *pc2 = 'b'; /* 将 'b' 写到「位址0」,错误 */ 正确例子: char c; /* c 的内容尚未起始化 */ char *pc1 = &c; /* pc1 指向字元变数 c */ *pc1 = 'a'; /* c 的内容变为 'a' */ /* 动态分配 10 个 char(其值未定),并将第一个char的位址赋值给 pc2 */ char *pc2 = (char *) malloc(10); pc2[0] = 'b'; /* 动态配置来的第 0 个字元,内容变为 'b' free(pc2); 说明:指标变数必需先指向某个可以合法操作的空间,才能进行操作。 ( 使用者记得要检查 malloc 回传是否为 NULL, 碍於篇幅本文假定使用上皆合法,也有正确归还记忆体 ) 错误例子: char *name; /* name 尚未指向有效的空间 */ printf("Your name, please: "); fgets(name,20,stdin); /* 您确定要写入的那块空间合法吗??? */ printf("Hello, %s\n", name); 正确例子: /* 如果编译期就能决定字串的最大空间,那就不要宣告成 char* 改用 char[] */ char name[21]; /* 可读入字串最长 20 个字元,保留一格空间放 '\0' */ printf("Your name, please: "); fgets(name,20,stdin); printf("Hello, %s\n", name); 正确例子(2): 若是在执行时期才能决定字串的最大空间,C提供两种作法: a. 利用 malloc() 函式来动态分配空间,用malloc宣告的阵列会被存在heap 须注意:若是宣告较大阵列,要确认malloc的回传值是否为NULL size_t length; printf("请输入字串的最大长度(含null字元): "); scanf("%u", &length); name = (char *)malloc(length); if (name) { // name != NULL printf("您输入的是 %u\n", length); } else { // name == NULL puts("输入值太大或系统已无足够空间"); } /* 最後记得 free() 掉 malloc() 所分配的空间 */ free(name); name = NULL; //(注1) b. C99开始可使用variable-length array (VLA) 须注意: - 因为VLA是被存放在stack里,使用前要确认array size不能太大 - 不是每个compiler都支援VLA(注2) - C++ Standard不支援(虽然有些compiler支援) float read_and_process(int n) { float vals[n]; for (int i = 0; i < n; i++) vals[i] = read_val(); return process(vals, n); } 正确例子(3): C++的使用者也有两种作法: a. std::vector (不管你的阵列大小会不会变都可用) std::vector<int> v1; v1.resize(10); // 重新设定vector size b. C++11以後,若是确定阵列大小不会变,可以用std::array 须注意:一般使用下(存在stack)一样要确认array size不能太大 std::array<int, 5> a = { 1, 2, 3 }; // a[0]~a[2] = 1,2,3; a[3]之後为0; a[a.size() - 1] = 5; // a[4] = 0; 备注: 注1. C++的使用者,C++03或之前请用0代替NULL,C++11开始请改用nullptr 注2. gcc和clang支援VLA,Visual C++不支援 补充资料: http://www.cplusplus.com/reference/vector/vector/resize/ -- 个人网页:http://gnitnaw.github.io/ 以後在C_and_CPP或LinuxDev发表的文章都会放一份在这边。 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 86.209.153.222
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1463129454.A.687.html ※ 编辑: wtchen (86.209.153.222), 05/13/2016 18:46:01
1F:→ Caesar08: c++11後,可以用std::array 05/13 19:01
2F:→ wtchen: 我都忘了还有这个,马上加 05/13 19:11
※ 编辑: wtchen (86.209.153.222), 05/13/2016 19:18:23 ※ 编辑: wtchen (86.209.153.222), 05/13/2016 19:18:37
3F:→ wtchen: 对了,请问std::array是存在stack里吗? 05/13 19:24
4F:→ Caesar08: std::array就是一个C形式的array 05/13 19:30
5F:→ wtchen: 所以一样不能宣告太大? 05/13 19:31
6F:→ Caesar08: 对 05/13 19:34
※ 编辑: wtchen (86.209.153.222), 05/13/2016 19:40:38 ※ 编辑: wtchen (86.209.153.222), 05/13/2016 19:40:56
7F:→ wtchen: 写到现在总觉得C跟C++5年内一定会分家... 05/13 19:46
8F:→ Caesar08: 最好快点分... 05/13 19:59
9F:→ wtchen: C++就像变心的女友一样回不来了.... 05/13 20:14
10F:→ tinlans: 永远检查 malloc 的传回值不是更好? XD 05/17 02:40
11F:→ wtchen: 我还真的很想在十三诫加这条 05/19 07:00







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BuyTogether站内搜寻

TOP