相关疑难解决方法(0)

如何在C中打印int的大小?

我正在尝试在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"的声明更改为以下内容并不重要

  1. signed int n = 10;
  2. int n = 10;

我想要做的就是在我的机器上打印整数的大小,而不是真正关注limits.h.

c

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

c结构中的压缩位字段 - GCC

我在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 gcc struct packed bit-fields

18
推荐指数
2
解决办法
2万
查看次数

sizeof(""+ 0)!= sizeof(char*)错误或未定义的行为?

以下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的操作数.

c sizeof undefined-behavior

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

像"1 $"这样的位置参数如何与printf()一起使用?

通过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是正确的; 为什么?

c format printf

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

如何修复警告:"签名和未签名之间的比较"?

我被建议在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

14
推荐指数
2
解决办法
2万
查看次数

不同编译器的不同输出 - C和C++

你能想到"一个程序",它为C和C++编译器提供了"不同的输出"(但是在同一种语言下提供了一致的输出)吗?

c c++ compilation

12
推荐指数
4
解决办法
1376
查看次数

输出sizeof()运算符的数据类型

我使用的是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)

c ubuntu sizeof gcc5 ubuntu-16.04

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

time_t的大小及其最大值

#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)

c

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

这里发生了什么?sizeof(short_int_variable + char_variable)

#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

c variables sizeof

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

指向指针的指针输入的函数

我看到了关于结果的这个问题 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 pointers sizeof

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