赵旭升 发表于 2018-4-8 20:11:10

关于用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;
}

感谢解答!

BngThea 发表于 2018-4-8 20:31:00

直接初始化给定每一个字符的形式不会自动加\0

Dr丶温 发表于 2018-4-8 21:02:41

字符形式的数组需要自己加上\0

赵旭升 发表于 2018-4-8 21:12:11

Dr丶温 发表于 2018-4-8 21:02
字符形式的数组需要自己加上\0

可是我没有加上,也并没有出现视屏中的乱码现象啊

赵旭升 发表于 2018-4-8 21:13:23

BngThea 发表于 2018-4-8 20:31
直接初始化给定每一个字符的形式不会自动加\0

恩恩,那我直接输出的话是不是不用在后面添加‘\0’?

BngThea 发表于 2018-4-8 21:24:43

赵旭升 发表于 2018-4-8 21:13
恩恩,那我直接输出的话是不是不用在后面添加‘\0’?

如果用下标索引可以不加
如果直接输出后面会有乱码

理想小青年 发表于 2018-4-8 21:25:31

简单理解 " "内存中最后\0‘ ’不会的

赵旭升 发表于 2018-4-8 21:59:46

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;
}

BngThea 发表于 2018-4-8 22:18:34

赵旭升 发表于 2018-4-8 21:59
可是我直接输出,每加‘\0’也没有乱码

那只是运气好而已
也有可能是现在的c已经智能添加了,但是原始情况下是不会自动添加的

桃花飞舞 发表于 2018-4-8 22:40:38

楼主,第一个是普通字符数组啊!第二个是字符串字面量来初始化数组

桃花飞舞 发表于 2018-4-8 22:44:52

赵旭升 发表于 2018-4-8 21:59
可是我直接输出,每加‘\0’也没有乱码

楼主用的什么编译器啊,竟然没乱码

风扫地 发表于 2018-4-9 17:39:31

本帖最后由 风扫地 于 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-9 19:35:26

桃花飞舞 发表于 2018-4-8 22:44
楼主用的什么编译器啊,竟然没乱码

Dev-C++ 5.11

赵旭升 发表于 2018-4-9 19:37:21

风扫地 发表于 2018-4-9 17:39
name1没手动\0 结尾。
而“hello”这种字符串默认以\0结尾



非常感谢!

桃花飞舞 发表于 2018-4-10 23:23:30

本帖最后由 桃花飞舞 于 2018-4-10 23:45 编辑

赵旭升 发表于 2018-4-9 19:35
Dev-C++ 5.11

我用的vc6是有乱码的,有的编译器是没有乱码的额额额

赵旭升 发表于 2018-4-12 20:30:25

桃花飞舞 发表于 2018-4-10 23:23
我用的vc6是有乱码的,有的编译器是没有乱码的额额额

恩恩~!
页: [1]
查看完整版本: 关于用sizeof()求字符数组长度的问题