小编roo*_*kea的帖子

隐式地抛出一个浮点常数

请看一下这段代码:

#include <stdio.h>

int main(void)
{
    short s;
    int i = 65696;
    float f = 65696.0F;

    printf("sizeof(short) = %lu\n", sizeof(short));

    s = i;
    printf("s = %hd\n", s);
    s = f;
    printf("s = %hd\n", s);

    s = 65696;
    printf("s = %hd\n", s);
    s = 65696.0F;
    printf("s = %hd\n", s);

    return 0;
}  
Run Code Online (Sandbox Code Playgroud)

它给出了输出:

sizeof(short) = 2
s = 160
s = 160
s = 160
s = 32767
Run Code Online (Sandbox Code Playgroud)

在最后一行为什么它是32767而不是160?说f = 65696.0F; s = f;和之间有什么区别s = 65696.0F;

c floating-point casting

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

gcc中的c内存管理

我在Ubuntu 12.10 x86_64上使用gcc版本4.7.2.

首先是我终端上数据类型的大小:

sizeof(char) = 1    

sizeof(short) = 2          sizeof(int) = 4
sizeof(long) = 8           sizeof(long long) = 8

sizeof(float) = 4          sizeof(double) = 8
sizeof(long double) = 16
Run Code Online (Sandbox Code Playgroud)

现在请看一下这段代码:

int main(void)
{   
    char c = 'a';
    printf("&c = %p\n", &c);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我没有错,我们无法预测任何有关地址的信息c.但每次这个程序给出一些随机的十六进制地址f.因此,下一个可用位置将是一些以十六进制结束的值0.在其他数据类型的情况下我也观察到了这种模式.对于int值,地址是以十进制结尾的十六进制值c.对于double,它是以结束的一些随机十六进制值8,依此类推.

所以我在这里有2个问题.

1)谁在管理这种内存分配?是gcc还是C标准?

2)无论是谁,为什么会这样?为什么变量的存储方式是下一个可用的内存位置以十六进制值结束0?任何特定的好处?

现在请看一下这段代码:

int main(void)
{   
    double a = 10.2;
    int b = 20;
    char c = 30;
    short d = …
Run Code Online (Sandbox Code Playgroud)

c arrays variables gcc memory-management

6
推荐指数
2
解决办法
620
查看次数

open()系统调用头文件要求

我正在使用x86_64 GNU/Linux与gcc.
大纲部分man -s2 open说:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int creat(const char *pathname, mode_t mode);
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试编译以下代码片段时,gcc不会抛出警告/错误.

#include <stdio.h>
#include <fcntl.h>

int main(int argc, char **argv)
{
    int fd;

    fd = open("foo.txt", O_RDWR, 0777);
    if(fd == -1)
        perror("open");

    fd = creat("foo.txt", 0777);
    if(fd == -1)
        perror("creat");

    close(fd);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

那么,types.hstat.h可选的?他们在manpage中的目的是什么open()

c manpage system-calls header-files

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

在C中使用tmpfile()时的临时文件位置

$ man tmpfile

该标准未指定tmpfile()将使用的目录.Glibc将尝试定义的路径前缀P_tmpdir <stdio.h>,如果那个目录/ tmp失败.

我使用的是Ubuntu 13.10 x86_64,gcc和libc BTW.

所以当我尝试使用tmpfile()创建临时文件时,我在/ tmp中看不到任何临时文件.(我可以# define P_tmpdir "/tmp"在stdio.h中看到).这是我使用的代码片段:

#include <stdio.h>

int main(int argc, char **argv)
{
    FILE *tmp;

    tmp = tmpfile();                            // Where's this file?
    scanf("%*d");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

$ ./tmpfile
现在,当scanf正在等待下一个(冗余)输入时,我应该能够在/ tmp中看到一个临时文件.但我不能.那么这个tmpfile到底在哪里创建?

c linux posix glibc temporary-files

5
推荐指数
2
解决办法
1202
查看次数

非 root 用户使用 `run-as` 构建规范构建 AWS CodeBuild

我想用非 root 用户构建。为了实现这一点,我正在研究run-as构建规范。

run-as:可选序列。仅适用于 Linux 用户。指定在此构建规范文件中运行命令的 Linux 用户。run-as 授予指定用户读取和执行权限。当您在 buildspec 文件的顶部指定 run-as 时,它会全局应用于所有命令。如果您不想为所有 buildspec 文件命令指定一个用户,您可以通过在其中一个阶段块中使用 run-as 为阶段中的命令指定一个用户。如果未指定 run-as,则所有命令都以 root 身份运行。

  1. 如何创建非root用户放入run-as
  2. 我在哪里创建该用户?
  3. 由于从 git 克隆的源文件归 root 所有,我需要设置哪些权限?

aws-codebuild

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

使用各种格式说明符打印short int

请看一下这段代码:

#include <stdio.h>
int main(void)
{
short s = -1;

printf("sizeof(short) = %lu\n", sizeof(short));
printf("sizeof(int) = %lu\n", sizeof(int));
printf("sizeof(long) = %lu\n", sizeof(long));
printf("s = %hd\n", s);
printf("s = %d\n", s);
printf("s = %ld\n", s);

return 0;
}  
Run Code Online (Sandbox Code Playgroud)

它给出了输出:

sizeof(short) = 2  
sizeof(int) = 4  
sizeof(long) = 8  
s = -1  
s = -1  
s = 4294967295  
Run Code Online (Sandbox Code Playgroud)

在最后一行,为什么s = 4294967295不是s = -1通过这个问题,我才知道在C中,当变量被提升时,它的值保持不变.

c casting integer-arithmetic

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

长整数算术中的歧义?

看看下面这段代码:

#include <stdio.h>

int main(void)  
{  
int a;

a = 2147483647;
printf("a + 1 = %d \t sizeof (a + 1) = %lu\n", a + 1, sizeof (a + 1));
printf("a + 1L = %ld \t sizeof (a + 1L) = %lu\n", a + 1L, sizeof (a + 1L));

a = -1;
printf("a + 1 = %d \t sizeof (a + 1) = %lu\n", a + 1, sizeof (a + 1));
printf("a + 1L = %ld \t sizeof (a + …
Run Code Online (Sandbox Code Playgroud)

c long-integer integer-arithmetic

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

的sizeof(执行)

我试过sizeof(printf),sizeof(foobar)等等,其中foobar是用户定义的函数.它返回1没有任何警告或错误.为什么1?

c function sizeof

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

C语言中运算符的优先级和相关性

请查看以下代码段:

int a = 10, b;  
b = (a) + (++a);                       //2  
printf("b = %d\n", b);  
Run Code Online (Sandbox Code Playgroud)

输出:

b = 22  
Run Code Online (Sandbox Code Playgroud)

在声明2中,有4个不同的运算符.其中()优先级最高.由于()操作员的关联性是从左到右为什么b = 22而不是21

$ gcc --version  
gcc (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3
Run Code Online (Sandbox Code Playgroud)

c operator-precedence associativity

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

对K&R第2版的怀疑

1. 8.2页面 Low Level I/O - Read and Write

    #include "syscalls.h"  
    int getchar(void)  
    {  
        char c;  
        return (read(0, &c, 1) == 1) ? (unsigned char) c : EOF;  
    }  
Run Code Online (Sandbox Code Playgroud)

unsigned char在return语句中转换c可以消除符号扩展的任何问题.

我们在这里谈论什么问题?为什么unsigned char呢?没有演员unsigned char会怎么样?

2. A7.4.8第204页 Sizeof Operator

当应用于结构或联合时,结果是对象中的字节数,包括使对象平铺数组所需的任何填充:n个元素的数组大小是一个元素大小的n倍

将对象平铺为数组是什么意思?我们在讨论结构和联合,突然之间这个数组是如何出现的?这个肯定看起来像一个错字,但我已经检查了勘误表的所有查询的勘误表.所以很可能我错过了一些东西或者给了我非英语的英语,我无法正确掌握它.

3. A7.17 Page 209 Assignment Expressions

其中一个必须满足以下条件的:<snip>; 或者两个操作数都是指向函数或对象的指针,这些函数或对象的类型相同,除了可能缺少constvolatile在右操作数中.

请用代码说明.类似的int a, b是具有相同类型的两个对象.等等

4. A12.5 Page 232 Conditional Compilation

除了检查条件的嵌套之外,忽略由条件的非活动臂控制的文本. …

c kernighan-and-ritchie c89

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