为什么我们需要C中的终止符

如何解决为什么我们需要C中的终止符

我是C编程语言的新手,并且最近几天一直在学习它。我对终止字符如何工作以及为什么需要它感到困惑。当我看网上的一些文档时,它们通常会指出我们初始化char数组时的最后一个字符必须为'\ 0'。但是,当我不将其插入char数组的末尾时,它似乎也可以编译并且运行良好。例如:

char test[4] = "test";
printf("%s\n",test );
printf("%lu\n",strlen(test) );

它会编译,正确打印出值,并strlen返回正确的值,这意味着编译器知道char数组中的最后一个字符在哪里。那么为什么我们必须在末尾添加“ \ 0”。这只是惯例吗?还是还有其他东西?

谢谢。

解决方法

您明确声明test为四个字符的数组,因此它是四个字符的数组,包含't','e','s'和't'。

printf(“%s”)期望以零结尾的字符串,strlen也是如此。您有四个字符的数组,不包含零,因此将其传递给printf或strlen是未定义的行为。

由于数组后跟未知字节,因此下一个字节为零可能完全是巧合。如果是这种情况,则可能是打印了“ test”,strlen()返回了4。但这纯粹是巧合。

还可能发生的是您的程序崩溃了。或打印“ testgarbagegarbagegarbage”并strlen返回大量数字。还是您的程序在开发过程中按预期的方式愉快地工作,并且在第一个付费客户使用它时崩溃。

您的代码具有未定义的行为,这仅意味着可能发生任何事情。您可以通过声明char test [] =“ test”来解决此问题。这样可以使test []足够大,可以容纳四个字符和一个零字节。

,

编译器知道静态声明的数组的长度。但是C比这更灵活,它允许您使用更多通用指针。当您通过指针访问数组时,编译器无法知道它指向哪个数组。特别是,当函数的参数是字符串时,它可以是程序中的任何字符串。

考虑以下代码:

char test1[4] = "test";
char test2[8] = "12345678";
char *test = (rand() % 2 == 0) ? test1 : test2;
printf("%s\n",test);

编译器无法知道test的长度-根据随机选择,它可能是4或8。

您也不能简单地将长度存储在字符串的开头,因为C允许您指向任何数组元素。考虑:

char test1[8] = "12345678";
char *test = &test[rand() % 8];
printf("%s\n",test);

还有其他语言可以使用间接语言解决此问题。例如,C ++具有std::string类,该类使用包含长度和指向字符串内容的指针的结构。创建子字符串时,它会分配一个新结构并复制数据。但是C是一种更简单的语言,旨在允许更多直接的内存访问。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?