我在char数组初始化时遇到了意外的交互。
当使用strlen( char parameter[] )作为char[]的大小进行初始化时,新初始化的char[]太大了。 我不确定是什么原因导致了这种情况。
int main(void)
{
char myString[] = { " " };
foo( myString );
}
int foo( char str[] )
{
char testString[ strlen( str ) ];
printf( "Length of testString: %lu\n", strlen( testString ) );
return 0;
}
当我运行foo时,输出结果为:
Length of testString: 6
当我期望它是1时。
更奇怪的是,当我在foo的testString初始化之前添加一个打印语句时,输出似乎神奇地自行修复:
int foo( char str[] )
{
printf( "Length of str: %lu\n", strlen( str ) );
char testString[ strlen( str ) ];
printf( "Length of testString: %lu\n", strlen( testString ) );
return 0;
}
现在foo会输出
Length of str: 1
Length of testString: 1
我有一种感觉,这可能与char[]传递到函数中的方式有关,或者可能是strlen的意外行为,但我真的不知道。
欢迎提供任何帮助。
testString
数组。你指定了大小,但是数组本身没有被初始化:它包含垃圾值。尝试对未初始化的数组应用strlen
会导致未定义的行为。这就是你观察到的情况。是的,未定义的行为可能会表现出不可预测的方式,甚至可能会看起来“神奇地自我修复”。 - AnT stands with Russia