我遇到了与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时。
更奇怪的是,当我在testString初始化之前向foo添加一个print语句时,输出似乎神奇地修复了自己:
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的意外行为,但我真的不知道。
感谢任何帮助。
答案 0 :(得分:5)
数组未初始化
char testString[ strlen( str ) ];
因此,将函数strlen应用于它会导致未定义的行为。
printf( "Length of testString: %lu\n", strlen( testString ) );
考虑到您可能不会初始化像testString
这样的可变长度数组及其声明。你可以写例如
char testString[ strlen( str ) ];
testString[0] = '\0';
您的意思似乎是sizeof
运算符。如果是这样,你可以写
printf( "Length of testString: %zu\n", sizeof( testString ) );
这是一个示范程序
#include <stdio.h>
#include <string.h>
void foo( const char str[] )
{
char testString[ strlen( str ) ];
printf( "Length of testString: %zu\n", sizeof( testString ) );
}
int main(void)
{
char myString[] = { " " };
foo( myString );
return 0;
}
它的输出是
Length of testString: 1
答案 1 :(得分:0)
现在是代码:
#include <string.h> // strlen(), strcpy()
#include <stdio.h> // printf()
int main(void)
{
char myString[] = { " " }; <<-- actual length 2 (a space + a NUL )
foo( myString );
}
int foo( char str[] )
{
char testString[ strlen( str ) ]; <<-- strlen() yields 1, and testString not initialized
printf( "Length of testString: %lu\n", strlen( testString ) ); <<-- strlen searchs until a NUL byte found which could be anywhere
return 0;
}
Suggested corrections:
int foo( char str[] )
{
char testString[ strlen( str )+1 ];
strcpy( testString, str );
printf( "Length of testString: %lu\n", strlen( testString ) );
return 0;
}
注意:上述/更正代码的输出为1
,但数组testString[]
实际为2个字节
另一种方法是:
int foo( char str[] )
{
char testString[ strlen( str ) ] = {'\0'};
printf( "Length of testString: %lu\n", strlen( testString ) );
return 0;
}
然后输出为0
,testString[]
的实际长度为1