关于用sizeof()求字符数组长度的问题
最近在学习小甲鱼的“带你学C带你飞”,学到第一季的字符和字符串,有一个疑问:为何用sizeof()求第一个字符数组name1的大小为5啊,系统不应该自动在后面加上一个结束字符‘\0’吗?源代码如下:
#include<stdio.h>
int main(){
char name1[] = {'F','i','s','h','C'};
char name2[] = "FishC";
int len1 = sizeof(name1);
int len2 = sizeof(name2);
printf("name1_len = %d\n",len1); //5
printf("name2_len = %d",len2); //6
return 0;
}
感谢解答!
直接初始化给定每一个字符的形式不会自动加\0
字符形式的数组需要自己加上\0 Dr丶温 发表于 2018-4-8 21:02
字符形式的数组需要自己加上\0
可是我没有加上,也并没有出现视屏中的乱码现象啊 BngThea 发表于 2018-4-8 20:31
直接初始化给定每一个字符的形式不会自动加\0
恩恩,那我直接输出的话是不是不用在后面添加‘\0’? 赵旭升 发表于 2018-4-8 21:13
恩恩,那我直接输出的话是不是不用在后面添加‘\0’?
如果用下标索引可以不加
如果直接输出后面会有乱码 简单理解 " "内存中最后\0‘ ’不会的 BngThea 发表于 2018-4-8 21:24
如果用下标索引可以不加
如果直接输出后面会有乱码
可是我直接输出,每加‘\0’也没有乱码
#include<stdio.h>
int main(){
char name[] = {'F','i','s','h','C'};
printf("%s\n",name);
printf("hello!");
return 0;
}
赵旭升 发表于 2018-4-8 21:59
可是我直接输出,每加‘\0’也没有乱码
那只是运气好而已
也有可能是现在的c已经智能添加了,但是原始情况下是不会自动添加的 楼主,第一个是普通字符数组啊!第二个是字符串字面量来初始化数组 赵旭升 发表于 2018-4-8 21:59
可是我直接输出,每加‘\0’也没有乱码
楼主用的什么编译器啊,竟然没乱码 本帖最后由 风扫地 于 2018-4-9 18:01 编辑
name1没手动\0 结尾。
而“hello”这种字符串默认以\0结尾
用for循环越界输出到name1看看是啥。。、、
测试代码:
int main()
{
char name1[] = { 'F','i','s','h','C' };
char name2[] = "FishC";
int len1 = sizeof(name1);
int len2 = sizeof(name2);
printf("name1_len = %d\n", len1); //5
printf("name2_len = %d", len2); //6
printf("%s \n", name1);
printf("%s \n", name2);
for (int i = 0; i < 10; i++) {
printf("name1[%d] = 0x%x \n",i,name1);
}
return 0;
}
输出结果:
没有默认添0(至于为什么是0xcc,此处不扩展,需要了解的请查阅https://www.cnblogs.com/findumars/p/7128303.html).
在用单个字符给字符数组赋值时,字符数组不会添\0(用整数给整数数组初始化的时候,难道会给你多补一个0??)
用字符串给字符数字赋值时,字符串本来就以\0结尾,所以生成的字符数组最后一个元素是\0。 桃花飞舞 发表于 2018-4-8 22:44
楼主用的什么编译器啊,竟然没乱码
Dev-C++ 5.11 风扫地 发表于 2018-4-9 17:39
name1没手动\0 结尾。
而“hello”这种字符串默认以\0结尾
非常感谢! 本帖最后由 桃花飞舞 于 2018-4-10 23:45 编辑
赵旭升 发表于 2018-4-9 19:35
Dev-C++ 5.11
我用的vc6是有乱码的,有的编译器是没有乱码的额额额 桃花飞舞 发表于 2018-4-10 23:23
我用的vc6是有乱码的,有的编译器是没有乱码的额额额
恩恩~!
页:
[1]