关于数组越界问题:char s[5] = {"ABCDE"}; char s[5] = {’A’, ’B’, ’C’, ’D’, ’E’};

两种情况是否都越界,情况有什么不同。末位是否为\0,怎样确保其为\0??

都没有越界
这是正常的,只是都是最后缺少了 字符串结束符'\0'而已。

一般情况下,你要自己想明白,定义的字符串的长度,这样你定义字符串时要比其实际长度大1个,这样可以防止出现问题。
char s[6] = {"ABCDE"}; //这个系统可以自动添加
char s[6] = {’A’, 'B’, 'C’, 'D’, 'E’ ,'\0'}; //这个需要自己手动添加。追问

不手动添加\0,也可以吧~测试没有错误,就是puts之后……

追答

你是说char s[6] = {’A’, 'B’, 'C’, 'D’, 'E’ ,'\0'};这个也不用自己手动添加??

追问

恩呢 puts后没有出错

追答

那看来也有系统默认赋值,就像int数组部分元素赋值时,剩余元素都初始化为0,看来字符数组应该是用结束符初始化的。

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-12-05
char s[5] = {"ABCDE"};貌似等价于char s[5] = {’A’, 'B’, 'C’, 'D’, 'E’,'\0'};越界,char s[5] = {’A’, 'B’, 'C’, 'D’, 'E’};没有越界,不过输错字符串的时候后面会多出一些你无法预料的东西。前一种赋值方法会自动在末尾添加'\0',后一种则要把'\0'写进去
第2个回答  2011-12-05
我认为第一个有语法错,第二个不越界。只不过字符数组没有以'\0'结尾,不能整体输出(输出可能出现乱码),但可以一个元素一个元素的输出。
//下面是测试程序。
#include <stdio.h>
void main()
{
char s[5] = {'A', 'B', 'C', 'D', 'E'};
for (int i=0;i<5;i++)
printf("%c",s[i]);
}追问

第一个和第二个有什么本质区别呢~不太理解耶

追答

第一个有语法错。
char s[5] = {"ABCDE"};
//等价于
char s[5] = {‘A‘,'B','C','D','E','\0'}; //用6个常量去初始化5个元素,C语言语不允许,这也是与第二个的区别。

追问

太谢谢哈 顿悟……不过我想把财富值给级别比较低的朋友,介意么

第3个回答  2011-12-05
追问为什么呢……#include<stdio.h>
main(){
char s[5] = {'a','b','c','d','e'};
puts(s);
}
最后一位也是乱码啊

你最后又用了一个puts(s);
如果你输入的字符串长小于5,就没事,要是大于等于5,就又越界了。
因为puts()函数会在你输入的字符串后自动加一个“\0”作为结束符本回答被提问者采纳
第4个回答  2011-12-05
第一种情况,实际上是将一个字符串常量"ABCDE"赋值给一个字符串变量S,字符串常量(变量)系统会默认加一个结束标志'\0'。

关于数组越界问题:char s[5] = {"ABCDE"}; char s[5] = {’A...
char s[6] = {"ABCDE"}; \/\/这个系统可以自动添加 char s[6] = {’A’, 'B’, 'C’, 'D’, 'E’ ,'\\0'}; \/\/这个需要自己手动添加。

char s〔5〕={"ABCDE"};为什么不能正确进行字符串赋值操作
语法错误了。char s(5)={"A","B","C","D","E"};我编程刚入门,呵呵,不知道对不对。你可以试下。

...C语言题目。 对字符窜的定义char str[5]="abcde"是正确的。_百度知...
所以字符串"abcde"长度是6 数组越界

C语言的字符数组中sizeof()操作符的计算问题,请帮忙进来看看!
char s[5] 是 5个字符,s[5] = '\\0'; 属于内存越界操作 sizeof不关心'\\0',它只跟变量定义有关,即使s里存储的都是'\\0',sizeof(s)还是5 "abcde"是个常量字符串,c的定义里自动给常量字符串加了结束符'\\0'.所以它相当于{ 'a', 'b', 'c', 'd', 'e', '\\0' } char c[...

...s[5]={'1','2','3','4','5'};和char s[5]={“12345”};有错吗...
char s[5]={'1','2','3','4','5'};是可以的,但 char s[5]={“12345”};则错了。因为存储字符串"12345"需要6个字节。(外加一个串结束符'\\0')

关于strlen
1."abcde"长度为5,但最后还有个字符串结束符,因此char a[5]是放不下的,应该用char a[6]= "abcde";char a[5]="abcde";会导致a的每个元素都不是结束符,紧接a之后的内存区域又不被初始化(C中初始化列表超过数组大小的行为是未定义行为,这里Dev-C++显然没有因为初始化而填充不在a中的...

C语言基本语法知识(十四)数组越界与内存溢出
一、数组越界:边界探索与潜在风险\/ C语言中的数组访问,就像一把钥匙,必须对准正确的锁孔。一个定义为n元素的数组,其合法索引范围是0到n-1。例如:int a[5] = {0}; \/\/ 0到4是安全区 尝试访问a[5],就像试图打开已经满员的邮箱,这就陷入了数组下标越界。编译器通常不会预警,但运行时可能...

C语言定义字符串数组元素时满了,没有给\/0的位置会怎么样?
char c[5] = { 'A', 'B', 'C', 'D','E'};这样写才可以。其次,不留0的位置,那么该数组的最后一个成员就是'E';只有你把它当成一个字符串使用的时候才可能发生问题。比如用它printf("%s", c)这样输出,因为后面没有0结束符,可能输出乱码或直接挂掉。不把它当字符串用的时候,它和...

关于char字符串的问题。 char arr[3]={'a','b','c'}; std::cout<<arr...
你的数组越界了 char arr[3]={'a','b','c'};字符数组最后必须多留一个给'\\0'标识数组结束。所以大小应该设定为4 char arr[4]={'a','b','c'};还有你如果是想输出数组的地址,就必须传给他地址值,std::cout<<arr 这样调用,编译器会解析为调用cout << (const char*)std::...

C语言字符数组越界输出
所以当你输入12个'w'时,strlen(a)会等于12,sizeof(a)同样也是12,所以会得到12个w..这其实是非法的,虽然能够通过编译,但可以说这是个很危险bug..而且b数组也存在危险,因为它并没有以'\\0'结束,所以,你用strlen(b),测试它时,结果是不确定的,取决于它在b[9]后面的那个字节上找到'\\0'字符.....

相似回答