如果我改变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;
}
为什么我会遇到这个错误?
答案 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位系统上)用作字符串指针。正如您所理解的那样,该字符串指针不是有效指针,因此您有未定义的行为,在您的情况下会导致崩溃。