printf格式字符串:参数顺序和分段错误

时间:2014-03-25 11:15:32

标签: c segmentation-fault printf

如果我改变printf格式字符串中参数的顺序,我会遇到分段错误。

int main( int argc, char *argv[] )
{
    _uint64 test_var = 50000000;
    char str[20] = { };
    sprintf( str, "TEST_STRING" );

    printf( "test_var %lld str %s\n", test_var, str ); //OK
    printf( "str %s test_var %d\n", str, test_var ); //OK
    printf( "test_var %d str %s\n", test_var, str ); //Segmentation Fault

    return EXIT_SUCCESS;
}

为什么我会遇到这个错误?

2 个答案:

答案 0 :(得分:1)

printf( "test_var %d str %s\n", test_var, str ); //Segmentation Fault
                  ^^

您应该使用%lld

答案 1 :(得分:1)

64位值是64位(8字节)。 int(格式说明符"%d"使用的)是32位(4字节)。

那么printf在崩溃行中的作用是读取4个字节作为整数打印,然后它将读取剩余的4个字节(在32位系统上)或剩余的4个字节和第1个字节字符串指针的四个字节(在64位系统上)用作字符串指针。正如您所理解的那样,该字符串指针不是有效指针,因此您有未定义的行为,在您的情况下会导致崩溃。