数组从一开始就不为空

Rai*_*aze 1 c

我是C的初学者....我有一些代码:

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

int main(){
   char str1[100];
   char str2[100];
   char str3[100];
   char str4[100];

   puts(str1)
   puts(str2);
   puts(str3);
   puts(str4);

   return 0; 
}
Run Code Online (Sandbox Code Playgroud)

我得到了结果

2
èý(
‘Q]wØ„ÃîþÿÿÿÀ"bwd&bw
Run Code Online (Sandbox Code Playgroud)

我不知道为什么我的数组从开始就没有空.我必须将第一个元素设置为"\ 0"以清除数组的内容.任何人都可以为我解释.非常感谢.

Eri*_*c Z 11

在C中,如果不为它们赋值,则不会自动初始化局部变量.这里你的数组是未初始化的,这意味着它们在创建后可能包含垃圾.

是的,你需要明确地将它设置为"空",如:

char str[100];
str[0] = '\0';
// Now you have an empty string of zero length.
assert(strlen(str) == 0);
// But the size is still 100.
printf ("%d", sizeof(str));
Run Code Online (Sandbox Code Playgroud)

或者,您可以在初始化期间创建空字符串(字符数组).它具有与上述示例相同的大小和长度.

char str[100] = "";
Run Code Online (Sandbox Code Playgroud)

  • `strlen(str)= 0;`←这很令人困惑,起初我想:为什么这甚至编译(分配一个POD右值?)然后我明白了.但我认为你应该改写它. (2认同)

Cro*_*man 7

至于为什么它不会自动将字符串归零,这是因为这样做会很昂贵,并且C通常不会做那些你没有明确告诉它要做的代价高昂的事情.至少,它必须将每个数组的第一个元素设置为零,并且在很多情况下您不希望或不需要像这样初始化数组.如果C总是为你做这件事,那么你总是会有无用的开销而你无法摆脱.

作为一般规则,C在背景中没有做任何你没有明确告诉它做的事情,所以当你要求一个数组时,它只是给你一个数组,除非你告诉你不要触及内容它来.它可以为程序员创建更多的工作,但有利于对计算机正在做的事情进行更精细的控制.

有些人会认为总是初始化你的变量是一个很好的编程习惯,并且忘记这种微小的成本,并且很多时候他们会有一个好点,但C故意是一个非常灵活和低级别的语言,它不会强迫你做这样的事情.