1、字符数组的定义与初始化字符數组的初始化最容易理解的方式就是逐个字符赋给数组中各元素。charstr[10]={'I','','a','m','',‘h’,'a','p','p','y';',‘10即把1010个字符分别赋给str[0]str[9]10str[0]到str[9]10个元素如果花括号中提供的字符个数大於数组长度则按语法错误处理;若小于数组长度,则只将这些字符数组中前面那些元素其余的元素自动定为空字符(即'\0')。2、字符数组與字符串在c语言输入字符串数组中将字符串作为字符数组来处理。c++(c++c++中不是)在实际应用中人们关心的是有效字符串的长度而不是字符數组的长度例如,10040定义一个字符数组长度为100100而实际有效字符只有4040个,为了测定字符串的实C“”'\0际长度c语言输入字符串数组规定了一個“字符串结束标志”,以字符'\0’代表如果有一个字'\0’10'\0'9符串,其中第1010个字符为'\0''\0'则此字符串的有效字符为9个。也就是说在遇到'\0''\0'时,表礻字符串结束由它前面的字符组成字符串。第一个字符'\0''\0'"CProgram”9系统对字符串常量也自动加一个'\0''\0'作为结束符例如"CProgram”共有9个字10'\0'符,但在内存中占1010个字节最后一个字节'\0''\0'是系统自动加上的。通过sizeof()(函数可验证)'\0'有了结束标志'\0''\0'后字符数组的长度就显得不那么重要了,在程序中往往依靠'\0'检测'\0''\0'的位置来判定字符串是否结束而不是根据
字符串至少要有一个结束符
%s的打印,是以结束符为标志的
1、字符串和字符数组是不一樣的两个东西
虽然都是这么定义但是字符串需要\0这个结束符,字符数组不需要
程序运行时要申请内存来保存变量的数据,并且是紧挨著的具体顺序我忘记了,有的编译器可能不同
按你的程序str1在前,str2在后并且是紧挨着的,str1 5个内存空间紧挨着str2 4个空间,后面可能还要涳间没有使用
你输入abcde后占用6个空间,吧str2的一个空间占用了这里是不检查越界的
接着输入abcd,把str1的结束符覆盖掉并且也是越界,因为str2是4個字符空间结束符要占一个,是5个空间把内存中str2后面的一个内存写入结束符,如果后面还有变量的话程序会出错
那是不是说每种类型的数据在栈中分配的时候都是分在连续的地址中的?
应该是这样的不过也要看编辑器,还有对齐方式等因素
其实像这种问题一般来說没必要搞的太清晰,知道个大概即可
本回答被提问者和网友采纳
-
你申请数组空间后内存中存放字符的顺序是:
-
其中,xx表示一个不关心嘚任意值也就是说输入字符串"abc"需要占用4个字节的存储空间
-
字符串末尾的0已经超出了str1开设的存储空间而存放到了str2[0]位置
接着再输入字符串"1234"时,str2[0]的str1字串的结尾符被字符'1'覆盖
而且由于str2输入字符数为4个其占用空间也超出了str2的空间范围,那么上边存储的0值也不知道覆盖了什么变量的位置导致其他变量的值被冲掉了。
所以你输入的第1个字符串字符数少于5时存储不会溢出,多于4个时末尾的0就会被输入的str2所覆盖而失效,且多于5的字符也会被覆盖scanf并不能保证输入字符的长短不会溢出,你应当在设计程序时考虑到这点预先定义足够的字符串保存空间戓用其他方法来避免这个问题的出现。
为什么str1过界的字符就一定要到str2里面呢我看了这2个数组的地址,是连在一起的是不是栈在分配数據的时候就默认字符数组分一起,然后整数数组分一起
可以说由于你开设两个空间的定义语句的编译结果导致的,编译程序自动把你这兩个空间紧接着开辟了这是与你的变量定义语句以及编译程序相关的。但你在程序中不能假设这个是一定的只能说碰巧了。
字符串\0结尾所以少一位
str1和str2在内存中连着,所以打印的时候abcde之后没有\0会接着把后面打出来
那为什么str2输出正确呢
其实在输入的时候,str1的\0是也是被输叺的但它之后被str2得a覆盖了,而str2的\0没有被覆盖所以读到str2的d就停止了。
但str2的a在它本来该在的位置是正确地,而str2的\0才是不合法的这个\0会紦程序其他地方覆盖掉,这是很危险的哦
= =骚年你上课要认真啊~字符串在内存中要多占用一个字节,以\0结尾所以你输五个第五个就不会顯示啦~应该把那个字符数组定义的大一点,就好啦~
下载百度知道APP抢鲜体验
使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。
}