我运行了一个C程序,并在不同的C编译器上获得了不同的输出.以下是我的计划
void main()
{
int i=5;
printf("%d%d%d%d%d",i++,i--,++i,--i,i);
}
Run Code Online (Sandbox Code Playgroud)
ON boarnland c ++ complier o/p is
45545
并在gcc上
45555
是真的依赖于编译器还是依赖于操作系统?
函数调用中的参数从左到右被压入堆栈.评估是从堆栈弹出.并且评估是从右到左,因此结果.
我想知道哪个是编写循环的最佳方法?
Count Down_to_Zero循环优于Count_Up_Loops吗?特别是在嵌入式系统环境中哪一个更好选择???
可能重复:
C是否支持重载?
我想知道printf是否支持C中的函数重载,因为在一个C程序中可以以多种方式使用相同的printf函数.
大家好,
我想知道下面结构的大小是多少.根据我的计算它应该是20.还有一件事是这种结构有什么方法考虑它的变量t的大小?
请忽略任何语法错误,我在32位机器上
struct structc
{
char c;
double d;
int s;
} t;
main()
{
printf("sizeof(structc_t) = %d\n", sizeof(t));
}
Run Code Online (Sandbox Code Playgroud) 我在接受采访时被问过,这台机器上的有效声明是不是16位?
以下是声明,
unsigned int zero = 0;
unsigned int compzero = 0xFFFF;
Run Code Online (Sandbox Code Playgroud) 我有几个typedef语句,但现在确定它有原始类型
typedef unsigned int addrt;
typedef addrt addr32t;
Run Code Online (Sandbox Code Playgroud)
"addr32t"只是一个无符号整数吗?
我有Linux内核并尝试使用objcopy工具生成ELF Header,下面是第一步
objcopy -I binary -B i386 -O elf32-i386 --rename-section .data=.text linux_kernel.bin main.o
Run Code Online (Sandbox Code Playgroud)
在此之后我想使用readelf -s main.o读取符号表,但是输出下面的奇怪符号
Symbol table '.symtab' contains 5 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 SECTION LOCAL DEFAULT 1
2: 00000000 0 NOTYPE GLOBAL DEFAULT 1 _binary_linux_kernel_bin_
3: 004df650 0 NOTYPE GLOBAL DEFAULT 1 _binary_linux_kernel_bin_
4: 004df650 0 NOTYPE GLOBAL DEFAULT ABS _binary_linux_kernel_bin_
Run Code Online (Sandbox Code Playgroud)
现在应该可以看到像这样的符号
_binary_linux_kernel_bin_start
_binary_linux_kernel_bin__end
_binary_linux_kernel_bin_size
Run Code Online (Sandbox Code Playgroud)
任何人都可以让我知道我在哪里做错了吗?还是期待一个?
为什么我想看到正确的符号,因为必须做类似下面的事情
--entry_point=_binary_linux_kernel_bin_start
Run Code Online (Sandbox Code Playgroud) 我制作了一个简单的程序,只需按下一个数字并将其显示在屏幕上,但不知道出了什么问题
section .data
value db 10
section .text
global main
extern printf
main:
push 10 //can we push value directly on stack?
call printf
add esp,4
ret
Run Code Online (Sandbox Code Playgroud)
以上获取分段错误.
section .data
value db 10
section .text
global main
extern printf
main:
push [value]
call printf
add esp,4
ret
Run Code Online (Sandbox Code Playgroud)
在第二个版本中,将值变量指向的值推送到堆栈
但是"未指定操作大小"
我是Linux新手并且学习Linux如何了解可用的物理存储器.我知道有一些BIOS系统调用int 0x15,它将为你提供E20内存映射.
现在我找到了一段代码,其中说明了将EFI内存映射转换为E820内存映射的定义.上面的意思是什么?
这是否意味着主板固件是基于EFI的,但由于此代码在x86上运行,我们需要将其转换为E820内存映射
如果是这样,x86是否只知道E820内存映射?
E820和EFI内存映射有什么区别?
期待得到详细的答案.
以下链接说"始终未访问设备寄存器的访问权限"
我的问题是,当访问存储器映射的设备寄存器时,我们是否需要易失性?