c strlen和sizeof详解

用双引号定义并且声明的时候明确指定数组大小的话,sizeof就会返回指定的大小,不会自动加1;

char str2[10] = "hello c";
printf("strlen = %ld\n", strlen(str2));
printf("sizeof = %ld\n", sizeof(str2));
//strlen = 7
//sizeof = 10

用大括号定义并且声明的时候明确指定数组大小的话,sizeof就会返回指定的大小,不会自动加1;

char str5[10] = {‘h‘,‘e‘,‘l‘,‘l‘,‘o‘,‘ ‘,‘C‘};
printf("strlen = %ld\n", strlen(str5));
printf("sizeof = %ld\n", sizeof(str5));
//strlen = 7
//sizeof = 10

用双引号定义并且声明的时候没有明确指定数组大小的话,sizeof就会是实际的大小+1;strlen也正常

char str1[] = "hello c";
printf("strlen = %ld\n", strlen(str1));
printf("sizeof = %ld\n", sizeof(str1));
//strlen = 7
//sizeof = 8

用大括号定义并且声明的时候没有明确指定数组大小的话,sizeof就会是实际的大小(不加1);但是strlen就变得诡异了,而且每次执行的结果的不一样

char str4[] = {‘h‘,‘e‘,‘l‘,‘l‘,‘o‘,‘ ‘,‘C‘};
printf("strlen = %ld\n", strlen(str4));
printf("sizeof = %ld\n", sizeof(str4));
//strlen = 14
//sizeof = 7

用双引号定义并且声明的时候明确指定数组大小,比实际的小的话,sizeof就会返回指定的大小,不会自动加1;但是strlen就变得诡异了,而且每次执行的结果的不一样

char str3[5] = "hello c";
printf("strlen = %ld\n", strlen(str3));
printf("sizeof = %ld\n", sizeof(str3));
//strlen = 12 strlen就变得诡异了,而且每次执行的结果的不一样
//sizeof = 5
char cr[] = {‘a‘,‘b‘,‘\0‘,‘c‘,};
char cr1[] = {‘a‘,‘b‘,0,‘c‘,};
printf("cr strlen = %ld\n", strlen(cr));
printf("cr1 strlen = %ld\n", strlen(cr1));
printf("cr sizeof = %ld\n", sizeof(cr));
//cr strlen = 2
//cr1 strlen = 2
//cr sizeof = 4

通过以上的代码可以得出以下结论

  • strlen的原理是一直计数,直到遇到‘\0‘为止
  • 用双引号定义时,会在最后自动加上‘\0‘
  • 用大括号定义时,不会在最后自动加上‘\0‘
  • 用大括号定义时,如果声明的数量大于大括号里的数量,会在最后用‘\0‘填补缺失的位数
  • ‘\0‘ = 0

全局变量存放在静态区,静态区的初始值都是‘\0‘,所以strlen(str6)为0

char str6[10];
int main(){
  printf("strlen = %ld\n", strlen(str6));
  printf("sizeof = %ld\n", sizeof(str6));
}
//strlen = 0
//sizeof = 10

局部变量存放在栈区,栈区的初始值都是随机的,所以strlen(str6)为随机值

char str7[10];
printf("strlen = %ld\n", strlen(str7));
printf("sizeof = %ld\n", sizeof(str7));
//strlen = 12(随机值)
//sizeof = 10

以指针形式定义的话,sizeof返回的永远是指针的大小

char *p = "hello C";
printf("strlen = %ld\n", strlen(p));
printf("sizeof = %ld\n", sizeof(p));
//strlen = 7
//sizeof = 8
char *p1[3] = {"hello C","abcd","12345"};
printf("p1 strlen = %ld\n", strlen(*p1));//7
printf("p1 strlen = %ld\n", strlen(*(p1+1)));//4
printf("p1 strlen = %ld\n", strlen(*(p1+2)));//5
printf("p1 sizeof = %ld\n", sizeof(p1));//24 因为p1不是指针,p1是指针数组,数组里有3个指针所以3 * 8 = 24
char (*p2)[3000];
printf("p2 sizeof = %ld\n", sizeof(p2));//8 因为p2是数组指针,所以不管数组大小是多少,值都是8

函数的参数是数组时,有个经典的骗局,虽然fun函数的参数是数组,但是c语言不会在复制一个数组给形参,它会实际传递的是数组的首地址。

#include <stdio.h>
#include <string.h>

void fun(char str[]){//等同于void fun(char* str),所以sizeof(str)的值为8
  printf("strlen = %ld\n", strlen(str));
  printf("sizeof = %ld\n", sizeof(str));
}
int main(){
  char str[10] = "Hello C";
  printf("strlen = %ld\n", strlen(str));
  printf("sizeof = %ld\n", sizeof(str));
  printf("-------------------------------------\n");
  fun(str);
}
执行结果:
strlen = 7
sizeof = 10
-------------------------------------
strlen = 7
sizeof = 8

原文地址:https://www.cnblogs.com/xiaoshiwang/p/9174117.html

时间: 2024-10-13 01:27:14

c strlen和sizeof详解的相关文章

sizeof详解

sizeof.cpp #include<iostream> #include <stdio.h> #include <string.h> using namespace  std; struct { short a1; short a2; short a3; }A; struct { long a1; short a2; }B; class D { }; class A2 { char d,e; }; struct E { }; struct C { char b,c;

sizeof()详解

1. 定义:sizeof是何方神圣sizeof乃C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数.MSDN上的解释为:The sizeof keyword gives the amount of storage, in bytes, associated with avariable or a type (including aggregate types). This keyword returns a value of type size_

sizeof strlen 详解

详解sizeof和strlen 1 说明sizeof和strlen之间的区别 (1)sizeof操作符的结果类型是size_t,它在头文件中的typedef为unsinged int类型.该类型保证     能容纳实现所建立的最大对象的字节大小. (2)sizeof是算符,strlen是函数. (3)sizeof可以用类型作参数,sizeof还可以用函数作参数. strlen只能用char*作参数,且必须是以'\0'结尾的.比如: short f(); printf("%d\n",si

linux网络编程之shutdown() 与 close()函数详解

linux网络编程之shutdown() 与 close()函数详解 参考TCPIP网络编程和UNP: shutdown函数不能关闭套接字,只能关闭输入和输出流,然后发送EOF,假设套接字为A,那么这个函数会关闭所有和A相关的套接字,包括复制的:而close能直接关闭套接字. 1.close()函数 [cpp] view plain copy print? <span style="font-size:13px;">#include<unistd.h> int 

Linux 网络编程三(socket代码详解)

//网络编程客户端 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h>//htons()函数头文件 #include <ne

Android逆向之旅---SO(ELF)文件格式详解

第一.前言 从今天开始我们正式开始Android的逆向之旅,关于逆向的相关知识,想必大家都不陌生了,逆向领域是一个充满挑战和神秘的领域.作为一名Android开发者,每个人都想去探索这个领域,因为一旦你破解了别人的内容,成就感肯定爆棚,不过相反的是,我们不仅要研究破解之道,也要研究加密之道,因为加密和破解是相生相克的.但是我们在破解的过程中可能最头疼的是native层,也就是so文件的破解.所以我们先来详细了解一下so文件的内容下面就来看看我们今天所要介绍的内容.今天我们先来介绍一下elf文件的

(转)Linux IO模式及 select、poll、epoll详解

本文为转载,并作了部门调整.修改. [原文出处:https://segmentfault.com/a/1190000003063859] 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network IO. 一 概念说明 在进行解释之前,首先要说明几个概念: 用户空间和内核空间 进程切换 进程的阻塞 文件描述符 缓存 I/O 用户空间与内核空间 现在操作系统都是采用虚

使用 /proc 文件系统来访问 linux操作系统 内核的内容 &amp;&amp; 虚拟文件系统vfs及proc详解

http://blog.163.com/he_junwei/blog/static/19793764620152743325659/ http://www.01yun.com/other/20130422/366044.html 使用 /proc 文件系统来访问 Linux 内核的内容 这个虚拟文件系统在内核空间和用户空间之间打开了一个通信窗口 简介: /proc 文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在 Linux? 内核空间和用户空间之间进行通信.在 /proc 文件系统中,

利用SMTP发送Mail详解

利用SMTP发送Mail详解 分类: VC++程式开发 技术杂谈 2010-01-09 11:02 4135人阅读 评论(0) 收藏 举报 服务器headerdatesocket网络2010 在以前接触的项目中,一直都是在做网站时用到了发送mail 的功能,在asp 和.net 中都有相关的发送mail 的类, 实现起来非常简单.最近这段时间因工作需要在C++ 中使用发送mail 的功能,上网搜了一大堆资料,终于得以实现,总结自己开发过程中碰到的一些问题,希望对需的人有所帮助, 由于能力有限,