【问题标题】:why this code works in C为什么这段代码在 C 中有效
【发布时间】:2012-12-03 14:01:15
【问题描述】:
#include <stdio.h>

int main(){

char array[2];
array[0] = 'q';
array[1] = 'a';
printf("%s",array);

return 0;
}

如果你问我这段代码不应该工作。 printf 像字符串一样打印 array[2] 但它不是字符串。当我执行它时,它工作得很好。你能解释一下为什么吗?

【问题讨论】:

  • 嗯...你认为“字符串”在 C 中是如何表示的?
  • 它不起作用。如果代码符合您的预期,则代码“有效”。此代码不符合您的预期。它有一个错误,因此不起作用。修复错误,谜团就会消失。是的,有缺陷的代码会做一些你意想不到并且难以理解的奇怪事情。这是不编写错误代码的一个很好的理由。 (有缺陷的代码比好的代码更难理解。在您相当彻底地理解有效代码之前,我不建议您尝试理解有缺陷的代码。)
  • 你真的应该投资一本关于 C 的初学者书籍。如果不了解基础知识,就会有很多没有意义的东西......

标签: c


【解决方案1】:

当我执行它时,它运行良好。

您刚刚(不)走运:您的代码表现出未定义的行为,因为它让printf%s 参数在非空字符序列的末尾运行- 终止。

C 中的字符串是char 的序列,其中必须有一个值为0 的额外字符,称为空终止符。这是一种让您的代码在没有未定义行为的情况下工作的方法:

char array[3];
array[0] = 'q';
array[1] = 'a';
array[2] = '\0';

【讨论】:

  • 其实他倒霉了。代码没有按照他的预期做,并隐藏了一个缺陷。
【解决方案2】:

在 C 中,String 与字符数组相同。 C中没有String这样的东西。

【讨论】:

  • 可能值得注意的是,他所拥有的实际上是未定义的行为,因为没有终止 \0
  • 当我说字符串时,我的意思是字符数组,以 '\0' 结尾。这样 printf 不知道在哪里停止,为什么它没有显示错误?
  • @overflowed:数组末尾的字节必须有东西占用,而它恰好是零。因为代码有问题,这取决于数组结束后内存中发生的情况。
  • @DavidSchwartz:谢谢,这正是我所需要的
猜你喜欢
  • 2010-09-17
  • 2014-02-02
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多