C - 使用strlen制作数组错误大小的数组初始化

时间:2017-02-03 00:56:29

标签: c arrays string initialization

我遇到了与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的意外行为,但我真的不知道。

感谢任何帮助。

2 个答案:

答案 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)

记住两件事:

  1. strlen()产生字符串和
  2. 中NUL字符的偏移量
  3. 数组的偏移量从0开始,而不是1
  4. 现在是代码:

    #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;
    }
    

    然后输出为0testString[]的实际长度为1