C main()参数会弄乱数组声明

C main()参数会弄乱数组声明,c,arrays,C,Arrays,我一直在写一个关于加密的C学习程序,遇到了一个意想不到的问题: 当我将参数包括到main()函数中(如int main(int argc,char*argv[]))并尝试在代码中声明一个单独的字符数组(char array[2]={'a','b'};),这与main()参数无关,该数组的长度是8而不是2,当我试图打印它时,会向其中添加一些垃圾(例如,ab?iQ?) 而如果我声明main()而没有任何参数(int main()),则声明的字符数组的行为正常:大小为2,并像ab一样打印 main()

我一直在写一个关于加密的C学习程序,遇到了一个意想不到的问题:

当我将参数包括到
main()
函数中(如
int main(int argc,char*argv[])
)并尝试在代码中声明一个单独的字符数组(
char array[2]={'a','b'};
),这与
main()
参数无关,该数组的长度是8而不是2,当我试图打印它时,会向其中添加一些垃圾(例如,
ab?iQ?

而如果我声明
main()
而没有任何参数(
int main()
),则声明的字符数组的行为正常:大小为2,并像
ab
一样打印

main()
函数中的参数是否设置了代码中数组最小大小的限制?

在没有
nul
终止字节的
char
数组上使用
strlen()
会导致未定义的行为

c中的字符串由一系列非
nul
字节组成,以
nul
->
'\0'
字节结尾,因此

char array[2] = {'a','b'};
应该是

char array[3] = {'a', 'b', '\0'};
使
strlen()
正常工作

您可以像这样实现一个
strlen()

size_t stringlength(const char *string)
  {
      size_t length;
      length = 0;
      while (string[length] != '\0')
          length++;
      return length;
  }

因此,如果
'\0'
不存在,它将继续从数组中读取,并且它的边界会导致上述未定义的行为。

该数组以某种方式获得长度8而不是2
为什么这样说?这是strlen(数组)返回的值函数不能将包含两个字符的字符串放入一个空格为2字节的数组中。字符串需要3个字节。您可以在数组中放入两个字节,但它不是字符串。。。字符串函数不使用它。字符数组不一定是以null结尾的字符串。。。请注意,代码
array[]=“ab”
等于
array[]={'a'、'b'、'\0'}
如果需要查找数组的实际大小,而不是其中存储的字符串的长度,请使用
((sizeof array)/(sizeof array[0])
。谢谢,这很有效!如果我理解正确,像'char array[3]={'a','b'}'这样的指令会自动添加'nul'吗?是的<代码>字符数组[3]={'a','b'}添加一个NUL。C中没有部分初始化。在没有其他值的情况下,所有元素都被初始化为
0
。@DenysTriasunov:With
char array[3]={'a','b'}
,编译器不会自动添加空字符,但是如果
char array[3]='ab'
,它会自动添加空字符,您实际上不需要指定
3
@barakmanos:
char数组[30]={'a','b'}
完全等于字符数组[30]={'a','b',0,0,0,0,0,0}