首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于数组与指针的有关问题

2013-03-14 
请教高手关于数组与指针的问题近两天遇见了关于数组或者指针的问题int main(){int len char cardstr[8]c

请教高手关于数组与指针的问题
近两天遇见了关于数组或者指针的问题
int main()  

 {     
int len; 
char cardstr[8];
char keystr[8];
        char ciphercard[8];
char decryptcard[8]; 
printf("please input the card number:");
scanf("%s",cardstr);
len=strlen(cardstr);
printf("the lenth of input card is %d\n",len);
printf("the card number is %s\n",cardstr);
printf("please input the the key:");
scanf("%s",keystr);
printf("the key is %s\n",keystr);


         Encryptcard(cardstr,keystr,ciphercard);  
                .......
                .......
}


int Encryptcard(ElemType card[8], ElemType keyStr[8],ElemType ciphercard[8])
{

int i;
int len;
printf("the card string in encryptcard function is :\n");
printf("%s\n",card);
len=strlen(card);
printf("the len of card is %d:\n",len);
for(i=0;i<len;i++)
printf("%c ",card[i]); 
printf("\n");
                .......
                .......

}
当main函数中的cardstr[8]声明在keystr前面的时候,当分别对cardstr和keystr输入八个字符的时候,在main函数中的打印一切正常,可是在Encryptcard的时候打印出的cardstr的长度确实0,字符串cardstr也打印不出来
可是,当在main函数中把cardstr[8]声明在keystr后面的时候,分别对cardstr和keystr输入八个字符。在main函数中的打印也是一切正常,可是在Encryptcard这个函数中的打印却是cardstr的长度为16,而且打印出来的cardstr+keystr这连个字符串。请问高手们这是为什么呢? 数组?指针?内存分配
[解决办法]
输入的字符串还有一个结尾符'\0',造成了数组越界访问。第一个字符串的结束符占用了第二个字符串的首个位置,输入第二个字符串的时候覆盖了该字符,所以第一个字符串成了16个字符+一个结束符。
[解决办法]
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”
但我又不得不承认:
 有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物;
 而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。
而我本人属前者。

这辈子不看内存地址和内存值;只画链表、指针示意图,画堆栈示意图,画各种示意图,甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗?本人深表怀疑!
这辈子不种麦不收麦不将麦粒拿去磨面;只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头,压面条,烤面包,……能从本质上理解面粉、理解面食吗?本人深表怀疑!!

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?

不要写连自己也预测不了结果的代码!

电脑内存只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

------解决方案--------------------


8就只能存7个字符。

[解决办法]

引用:
8就只能存7个字符。


++

热点排行