我正在尝试在RHEL 5.6,64位上编译以下内容,并且我不断收到警告
"var.c:7:警告:格式'%d'需要类型'int',但参数2的类型为'long unsigned int'"
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
unsigned int n =10;
printf("The size of integer is %d\n", sizeof(n));
}
Run Code Online (Sandbox Code Playgroud)
如果我将"n"的声明更改为以下内容并不重要
我想要做的就是在我的机器上打印整数的大小,而不是真正关注limits.h.
我在linux上使用c中的结构.我开始使用位字段和"打包"属性,我遇到了一个奇怪的行为:
struct t1
{
int a:12;
int b:32;
int c:4;
}__attribute__((packed));
struct t2
{
int a:12;
int b;
int c:4;
}__attribute__((packed));
void main()
{
printf("%d\n",sizeof(t1)); //output - 6
printf("%d\n",sizeof(t2)); //output - 7
}
Run Code Online (Sandbox Code Playgroud)
为什么两个结构 - 完全相同 - 采用不同的字节数?
以下C程序:
#include <stdio.h>
int main(void)
{
printf("%u %u %u\n",sizeof "",sizeof(""+0),sizeof(char *));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在Linux上使用GCC编译时输出1 4 4,但在Windows上使用Microsoft Visual C++编译时输出1 1 4.海湾合作委员会的结果是我所期待的.它们是否有区别,因为MSVC有错误或者因为sizeof(""+ 0)未定义?对于两个编译器,无论使用什么字符串文字或整数常量,行为(即打印的中间值是否等于第一个值或最后一个值)都是相同的.
ANSI C标准中的相关参考似乎是6.2.2.1 - 左值和函数指示符:
"除非它是sizeof运算符的操作数...具有类型'数组类型'的左值被转换为具有类型'指向类型的指针'的表达式,该表达式指向数组对象的初始元素,而不是一个左值".
这里虽然"Except"不适用,因为在sizeof(""+ 0)中,数组/字符串文字是+而不是sizeof的操作数.
通过man
我找到
printf("%*d", width, num);
Run Code Online (Sandbox Code Playgroud)
和
printf("%2$*1$d", width, num);
Run Code Online (Sandbox Code Playgroud)
是等价的.
但IMO的第二种风格应该是:
printf("%*d", num, width);
Run Code Online (Sandbox Code Playgroud)
但通过测试似乎man
是正确的; 为什么?
我被建议在GCC中使用以下选项,因为它有助于避免许多常见错误.它会打开一堆警告并将-Werror
其变成错误.
gcc -pedantic -W -Wall -Wextra -Wshadow -Wstrict-overflow=5 -Wwrite-strings -std=c99 -Werror
Run Code Online (Sandbox Code Playgroud)
鉴于以下测试代码:
#include <stdio.h>
int main(void)
{
int arr[8]={0,10,20,30,40,50,60,70};
int x;
printf("sizeof(arr): %d\n", sizeof(arr));
printf("sizeof(int): %d\n", sizeof(int));
for(x = 0; x < sizeof(arr)/sizeof(int); x++)
{
printf("%d\n",arr[x]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我明白了:
test.c:11: error: comparison between signed and unsigned
Run Code Online (Sandbox Code Playgroud)
我知道我能解决这个问题的一种方法就是关闭警告,但是他们还没有让我使用这些设置来最终关闭它们.
另一种方法是投射东西,但我被告知铸造已被弃用.
另外,我可以将x变为unsigned int
:
unsigned x;
Run Code Online (Sandbox Code Playgroud)
但是,当我必须使用这些编译器选项将带符号值与无符号值进行比较时,它无法解决一般问题.是否有更清洁的方式而不是铸造?
你能想到"一个程序",它为C和C++编译器提供了"不同的输出"(但是在同一种语言下提供了一致的输出)吗?
我使用的是Ubuntu 16.04.5和GCC 5.4.0版.
我在玩sizeof()
操作员,写下面的代码:
#include <stdio.h>
int main(int argc, char *argv[]){
long int mylint = 31331313131.1313;
printf("size of long int is %d\n", sizeof(mylint));
printf("size of long int is %d\n", sizeof(long int));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用gcc -o ... ...
命令编译并期待:
size of long int is 8
size of long int is 8
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
fl_double_lint.c: In function ‘main’:
fl_double_lint.c:11:9: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
printf("size of long …
Run Code Online (Sandbox Code Playgroud) #include <stdio.h>
#include <time.h>
int main()
{
printf("Size of time_t is %lu bytes.\n", sizeof(time_t));
time_t biggest = 0x7fffffffffffffff; // line 1
printf("time_t's wrap around will be a second after %s.\n", asctime(gmtime(&biggest)) );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在time.h中,这是time_t的定义吗?
typedef __darwin_time_t time_t
Run Code Online (Sandbox Code Playgroud)
怎么解释呢?由于我不知道,我使用sizeof函数来查找time_t = 8个字节.
为什么第1行会给出错误呢?我收到了这个错误
Segmentation fault: 11
Run Code Online (Sandbox Code Playgroud) #include <stdio.h>
int main()
{
short int i = 20;
char c = 97;
printf("%d, %d, %d\n", sizeof(i), sizeof(c), sizeof(c + i));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我当sizeof(a + b)"a是短int类型&b是char类型时会发生什么"输出是:2,1,4
我看到了关于结果的这个问题 sizeof()
,我不理解这个函数的输出.
#include <stdio.h>
void checkSizes(char matrix3d[10][20][30])
{
printf ("%lu\t", sizeof(matrix3d));
printf ("%lu\t", sizeof(*matrix3d));
printf ("%lu\t", sizeof(**matrix3d));
printf ("%lu\t", sizeof(***matrix3d));
}
int main()
{
char matrix[10][20][30];
checkSizes(matrix);
}
Run Code Online (Sandbox Code Playgroud)
正如我所假设的,当一个函数得到一个数组工作时,它得到一个指向数组的指针,所以当我打印第一行
printf ("%lu\n", sizeof(matrix3d));
Run Code Online (Sandbox Code Playgroud)
输出将是8.
但是不是下一个printf会让我指向指针的不同指针,他的大小也会是8吗?
所以我会这会导致
8 8 8 1
Run Code Online (Sandbox Code Playgroud)
真正的输出是
8 600 30 1
Run Code Online (Sandbox Code Playgroud) c ×10
sizeof ×4
bit-fields ×1
c++ ×1
compilation ×1
format ×1
gcc ×1
gcc5 ×1
packed ×1
pointers ×1
printf ×1
struct ×1
ubuntu ×1
ubuntu-16.04 ×1
variables ×1