请看一下这段代码:
#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;?
我在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) 我正在使用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.h和stat.h可选的?他们在manpage中的目的是什么open()?
$ 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到底在哪里创建?
我想用非 root 用户构建。为了实现这一点,我正在研究run-as构建规范。
run-as:可选序列。仅适用于 Linux 用户。指定在此构建规范文件中运行命令的 Linux 用户。run-as 授予指定用户读取和执行权限。当您在 buildspec 文件的顶部指定 run-as 时,它会全局应用于所有命令。如果您不想为所有 buildspec 文件命令指定一个用户,您可以通过在其中一个阶段块中使用 run-as 为阶段中的命令指定一个用户。如果未指定 run-as,则所有命令都以 root 身份运行。
run-as?请看一下这段代码:
#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中,当变量被提升时,它的值保持不变.
看看下面这段代码:
#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) 我试过sizeof(printf),sizeof(foobar)等等,其中foobar是用户定义的函数.它返回1没有任何警告或错误.为什么1?
请查看以下代码段:
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) 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>; 或者两个操作数都是指向函数或对象的指针,这些函数或对象的类型相同,除了可能缺少const或volatile在右操作数中.
请用代码说明.类似的int a, b是具有相同类型的两个对象.等等
4. A12.5 Page 232 Conditional Compilation
除了检查条件的嵌套之外,忽略由条件的非活动臂控制的文本. …
c ×9
casting ×2
arrays ×1
c89 ×1
function ×1
gcc ×1
glibc ×1
header-files ×1
linux ×1
long-integer ×1
manpage ×1
posix ×1
sizeof ×1
system-calls ×1
variables ×1