a昊a 2019-06-13 10:22 采纳率: 66.7%
浏览 479
已采纳

c语言字符串问题,关于strlen与sizeof

先看一下源代码

#include <stdio.h>
#include <string.h>
#define PRAISE "What a super marvelous name!"
int main(void)
{
     char name [40];
     printf("What is your name ?\n");
     scanf("%s",name);
     printf("Hello %s. %s\n",name,PRAISE );
     printf("Your name of %d letters occupies %d memory cells.\n",
     strlen(name),sizeof(name));
     printf("The phrase of praise has %d letters ",strlen (PRAISE));
     printf("and occupies %d memory cells.\n",sizeof PRAISE);
     return 0;
} 

下面是运行情况
图片说明
问题是为什么输入的字符超过了 name的数组长度,而strlen函数给出的是正确的字符数,而sizeof给的是数组原长度,而且超过数组的部分怎么还能被是strlen正确计数?大神求解。

  • 写回答

1条回答 默认 最新

  • threenewbee 2019-06-13 10:31
    关注

    因为strlen并不理会数组越界,它就是从指针当前位置开始往后搜索\0并且计数。就是这么简单粗暴。

    sizeof(数组),这虽然看上去似乎是一个函数,但是要记住,sizeof不是函数,是运算符。运算符和函数的区别在于,它并不是在程序运行的过程中执行的,而是编译的时候就求值的。编译器知道你数组的长度,并且转换为一个整数,填写在 sizeof 的位置。

    实际上,在运行的时候,C语言根本没有数组长度这个概念。你没有办法传入一个数组给一个函数,让这个函数去计算这个数组的长度,这也是为什么strlen会越界的原因,它根本不知道什么时候结束。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 cgictest.cgi文件无法访问
  • ¥20 删除和修改功能无法调用
  • ¥15 kafka topic 所有分副本数修改
  • ¥15 小程序中fit格式等运动数据文件怎样实现可视化?(包含心率信息))
  • ¥15 如何利用mmdetection3d中的get_flops.py文件计算fcos3d方法的flops?
  • ¥40 串口调试助手打开串口后,keil5的代码就停止了
  • ¥15 电脑最近经常蓝屏,求大家看看哪的问题
  • ¥60 高价有偿求java辅导。工程量较大,价格你定,联系确定辅导后将采纳你的答案。希望能给出完整详细代码,并能解释回答我关于代码的疑问疑问,代码要求如下,联系我会发文档
  • ¥50 C++五子棋AI程序编写
  • ¥30 求安卓设备利用一个typeC接口,同时实现向pc一边投屏一边上传数据的解决方案。