2

我正在制作一个基本的字符串程序并做到了这一点。有这样一个字符串:

#include<stdio.h>
int main()
{
    char str[7]="network";
    printf("%s",str);
    return 0;
}

它打印network。在我看来,它不应该打印网络。应该打印一些垃圾值,因为'\0'不会结束此字符数组。那么它是如何打印出来的呢?也没有警告或错误。

4

4 回答 4

3

那是因为

char str[7]="network";

是相同的

char str[7]={'n','e','t','w','o','r','k'};

str是一个有效的char数组,但不是字符串,因为它不是以空值结尾的。因此,%s用于打印它是未定义的行为。

参考:C 常见问题:Is char a[3] = "abc"; 合法的?这是什么意思?

于 2013-10-03T09:02:53.000 回答
3
char str[7]="network"; 

这调用Undefined behavior.

您没有声明具有足够空间的数组

这应该是

char str[8]="network";  
于 2013-10-03T09:03:19.563 回答
0
char str[7]="network";

您没有为字符串提供足够的空间

char str[8]="network";
于 2013-10-03T09:09:33.973 回答
0

堆栈页面可能在您的系统中开始完全归零,因此字符串实际上在内存中以空值结尾,但这并不是因为您的代码。

尝试使用调试器查看内存中的程序,阅读您的平台文档或打印出内容str[7]以获得一些线索。这样做会调用未定义的行为,但当您试图弄清楚您的特定编译器和操作系统在某个给定时间点正在做什么时,它是无关紧要的。

于 2013-10-03T09:36:31.050 回答