Re: [问题]双重 指标存取字串

楼主: weiclin (CC)   2016-04-05 09:24:39
※ 引述《mp8113f (丹枫)》之铭言:
: http://ideone.com/UhNQlR 先附上原始程式码
: 这是某本书上的范例但是照打上去于DEv编译会出现错误
: 问题1 : 对于ptr = temp 的这行意义不是很了解
: 看字面上似乎想要让ptr指标指向temp指标存取的值(指向某字串的位址)
: 但temp并未初始,所以这个步骤对我来说有点诡异
: 问题2 : 我假设问题1的步骤可能是要这样写
: ptr = &temp
: 那么我想要让三个字串的起始位址连续存入三个内存位址中
: 于是我也写了跟范例一样的语法
: *(ptr+0) = string1;
: *(ptr+1) = string2;
: *(ptr+2) = string3;
: 而我想要确认这三个位址是否真的连续接着
: 于是自行加上输出
: for(n=0 ; n<3 ; n++)
: printf("第%d个字串的位址为%p\n",n+1,*(ptr+n));
: 不过1跟2的位址是连续,但第三个位址直接跳去不知道哪个地方
: 很明显不连续
: 以至于我在加上输出打印时就产生错误
: for(n=0 ; n<3 ; n++)
: printf("第%d个字串的字串为%s\n",n+1,*(ptr+n));
: 想要知道问题的点在哪边 Orz ..毫无头绪
: 问题3 : 关于置底常见错误的12
: 别想对二维阵列使用pointer to pointer
: 想请问各位前辈时否有现成的案例可供小弟参考
: 最近也是有类似的想法正在练习不过好像没出现问题
: 怕我正在走上这条看似正确的误途上
: 初次在板上请教,烦请各位不吝指教
我有点不知道该怎样回答你的问题
因为这段程式码真的....
把书烧掉好了,别乱丢以免被捡走祸乱别人
首先, ptr 是 char**, 而它指向的 temp 是 char*
也就是它是单一指标, 不是阵列
这种情况下你读取 *(ptr + 1) 只会拿到垃圾
如果写入 *(ptr + 1) = xxx... 那就是系统爆炸的开始
因为 ptr 是 char**, temp 是 char*
所以必须写 ptr = &temp
这么做的目的通常是因为你想让 temp 指到别的地方去
例如:
temp = string1;
printf("temp is %s\n", temp);
char **ptr2 = &temp;
// 修改 *ptr2 会影响到 temp
*ptr2 = string2;
printf("temp now is %s\n", temp);
输出应该是:
temp is BOOK
temp now is FOR
那么既然 ptr + n 只会拿到垃圾, 为什么你的版本可以印出字串来?
因为你把 temp 宣告在 string[1-3] 的前面
所以 ptr + n 很 "狗屎运" 的刚好指到你的 string
如果你把 temp 宣告改放在 string3 后面, 结果就不同了
或是你改动一下 string 123 的宣告顺序, 结果也会不一样
我不知道这个范例到底要讲什么主题
但后面那个 for 看起来占了很大的部份
所以给你一个 ptr + n 能够正确运作的版本
http://ideone.com/GbvhOv
作者: boss0405 (boss)   2016-04-06 12:09:00
会不会原po漏打什么啊,书会写出这种东西蛮令人难以置信
作者: mp8113f (丹枫)   2016-04-06 14:54:00
没有漏写,所以我提出了问题一觉得很怪..后来发现版上有其他篇一样发问的程式码,temp都有加上&,才惊觉是书错误而该书上的位址示意图也让三个string字串位址连续,让我以为这样连着宣告的内存一定会连续...不过有了各位大大的提点,点醒很多盲点,不能太相信书这本书是我拿大学时期的上课用书,可能现在已改版正确了

Links booklink

Contact Us: admin [ a t ] ucptt.com