相关疑难解决方法(0)

理论和实践中未定义的行为

我很久以前就有别人写的大型C++项目.它包含如下代码:

string CVersion::GetVersionStr() const
{
  string ret;
  char VersionStr[100];
  DWORD v1, v2, v3, Build;
  GetVersion(&v1, &v2, &v3, &Build);
  sprintf(VersionStr, "%d.%d.%d.%d", v1, v2, v3, Build);
  return string(VersionStr);
}
Run Code Online (Sandbox Code Playgroud)

现在我认为由于格式说明符(%d)格式错误,此代码具有未定义的行为.

DWORD 在我的电脑上声明为

typedef unsigned long DWORD;
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 代码是否包含未定义的行为?
  • 是否有任何平台/情况不会出现未定义的行为?也许对于v1的某些值可能没问题?
  • 该软件已经长时间正常工作,所以在实践中,尽管上面是未定义的行为,软件仍能正常工作吗?

PS.这个软件是用10年前的Visual Studio编写的

c++

9
推荐指数
1
解决办法
454
查看次数

short,int,long,float,double long,double,char的大小

我想找出(short/int/long/float/double/long double/char)大小,所以我写了这段代码:

printf("short\t\t%d\n", sizeof(short));    
printf("int\t\t%d\n", sizeof(int));
printf("long\t\t%d\n", sizeof(long));
printf("float\t\t%d\n", sizeof(float));
printf("double\t\t%d\n", sizeof(double));  
printf("long double\t%d\n", sizeof(long double));    
printf("char\t\t%d\n", sizeof(char));   
Run Code Online (Sandbox Code Playgroud)

但输出是:

type            bytes
short           512
int             512
long            1024
float           1024
double          1024
long double     1024
char            256
Run Code Online (Sandbox Code Playgroud)

为什么字节数如此之大?

不应该是2,8,......?

c sizeof

4
推荐指数
1
解决办法
1万
查看次数

即使交换参数,printf() 在 x86-64 平台上也会给出相同的输出

考虑以下代码:

#include <stdio.h>

int main() {
    printf("%lf %ld\n", 1234.0, 5678L);
    printf("%lf %ld\n", 5678L, 1234.0);
}
Run Code Online (Sandbox Code Playgroud)

两次调用都printf打印相同的 text 1234.000000 5678,这与第二次调用的代码不太匹配(可能应该是5678.0000 1234)。

我使用的是 x86-64 处理器上的 Linux 4.x,但我无法在 x86(32 位)上重现这一点。我认为它可以在 amd64 架构上的任何 Linux 系统上重现。

为什么交换的参数为 提供相同的输出printf,以及为什么它特定于 x86-64?

c printf variadic-functions

1
推荐指数
1
解决办法
174
查看次数

标签 统计

c ×2

c++ ×1

printf ×1

sizeof ×1

variadic-functions ×1