对于标量值,赋值运算符似乎将右侧的值复制到左侧。这对复合数据类型有何作用?例如,如果我有一个嵌套结构
struct inner {
int b;
};
struct outer {
struct inner a;
};
int main() {
struct outer s1 = { .a = {.b=1}};
struct outer s2 = s1;
}
Run Code Online (Sandbox Code Playgroud)
通过实验似乎确实如此,但是有人可以指出行为的规范吗?
我有一个C ++代码,如下所示:
#define xxx return
int main()
{
xxx 0;
}
Run Code Online (Sandbox Code Playgroud)
它按预期工作。
现在,我像这样更改代码:
#define xxx return
#define TEST(X) ((X) == (false) ? (xxx 1) : ())
int main()
{
bool b = false;
TEST(b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
一句话,我想return 1如果b是false。但是我得到了错误:
error: expected primary-expression before ‘return’
Run Code Online (Sandbox Code Playgroud) 剪下我的代码:
uint16 myArray_A[5];
uint8 myArray_B[10] = {0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0x10};
uint8 idx = 0;
for (idx= 0; idx< 5; idx++)
{
myArray_A[idx] = ((myArray_B[idx *2]<<8) | myArray_B[((idx++ *2)+1)]);
}
Run Code Online (Sandbox Code Playgroud)
该代码到目前为止有效。但是我从这个主题中得到了 MISRA 警告。知道如何避免它们吗?
我目前正在为我的编译器项目编写一个运行时,我想要通用且易于使用的结构来编码不同的类型(源语言是方案)。
我目前的做法是:
struct SObj {
SType type;
uint64_t *value;
};
Run Code Online (Sandbox Code Playgroud)
指针总是 64 位或 32 位宽,所以不应该将浮点数放入我的值中吗?然后,如果我想要浮点数的实际值,我只需要原始字节并将它们解释为浮点数。
提前致谢。
所以,我正在尝试一些东西,我注意到如果你读取一个包含 11111111 作为无符号整数的地址,它显示值是 4294967295 而不是 255,这是为什么?
代码示例:
unsigned int a = 255;
unsigned int* p = &a;
char *p0 = (char*)p;
cout << (void*)p0 << " " <<(unsigned int)*p0<<endl;
Run Code Online (Sandbox Code Playgroud) 我想问:Linux 上的 Apache Webserver 之类的应用程序,Wireshark 之类的应用程序,以及网络工具之类的软件以及其他必须与网络连接一起工作的现实世界应用程序,它们是否需要内核模块,如果不需要,那么它在多大程度上是正常的实践应用程序确实具有内核模块。就像当我安装一些应用程序然后内核模块安装它一样。我知道当我从 Windows 启用 IIS 服务器时,会启用特定的内核模块来执行 IIS 工作。(不知道为什么那个操作系统没有实现原始套接字 api 以便开发人员可以使用)
我的问题:前段时间我试图使用原始套接字制作 tcp 服务器,但发现这并不容易,因为内核会做各种各样的事情(如果我错了,请纠正我)
检查欺骗数据包
在数据包中添加自己的标头信息
所以我要制作一个在内核中执行以下操作的应用程序
应用程序将仅充当命令控制器。喜欢用户可以使用应用程序进行上述 4 点中指定的更改。
所以我想问你,如果有人喜欢在应用程序中选择嵌入式内核模块,为什么应用程序有一个内核模块是一种常见的做法,为什么这是一个重新选择的选项,
以上内容仅供学习使用。
在 C 中,有没有办法为以下联合类型声明隐式类型转换:
enum COMP {
LessThan,
Equal,
GreaterThan
};
Run Code Online (Sandbox Code Playgroud)
将它映射到一个整数:
enum COMP {
LessThan : 1,
Equal : 0,
GreaterThan : -1
};
Run Code Online (Sandbox Code Playgroud) 我尝试运行二维字符数组(字符串数组)的代码,根据编译器和网站,代码显示的垃圾值约为 10x25-10x40(字符串大小)。
#include<stdio.h>
#include<string.h>
int main()
{
int n=0;
char name[10][30];
char e[20];
int i;
for(i = 0; i < 30; i++)
{
strcpy(name[i],"0");
}
for(i = 0; i < 30; i++)
{
printf("\n%s",name[i]);
}
}
Run Code Online (Sandbox Code Playgroud) 以前我见过很多C++函数的汇编。在 gcc 中,所有指令都以以下指令开头:
push rbp
mov rbp, rsp
sub rsp, <X> ; <X> is size of frame
Run Code Online (Sandbox Code Playgroud)
我知道这些指令存储前一个函数的帧指针,然后为当前函数设置一个帧。但在这里,程序集既不要求映射内存(如 malloc),也不检查所指向的内存是否rbp分配给进程。
因此它假设启动代码已经为调用堆栈的整个深度映射了足够的内存。那么到底为调用堆栈分配了多少内存呢?启动代码如何知道调用栈的最大深度?
这也意味着,我可以远距离访问越界数组,因为虽然它不在当前帧中,但它映射到进程。所以我写了这段代码:
int main() {
int arr[3] = {};
printf("%d", arr[900]);
}
Run Code Online (Sandbox Code Playgroud)
当索引为 900 时,它会退出。SIGSEGV但令人惊讶的是,当索引为 901 时,它不会退出。同样,SIGSEGV对于某些随机索引,它会退出,而对于某些索引则不会。在编译器资源管理器中使用 gcc-x86-64-11.2 进行编译时观察到此行为。
我写这篇文章主要是为了澄清我在 Stackoverflow 上偶然发现的一些关于函数指针的令人困惑/误导的信息。
让我们从一个例子开始:
#include <iostream>
void func ()
{
std::cout<<"func here"<<'\n';
}
int main()
{
void (*fp)()=func;
void (&fref)()=func;
func();//call through function
(&func)();//call through function pointer
(*fp)();//call through function
fp();//call through function pointer
fref();//call through function
(&fref)();//call through function pointer
}
Run Code Online (Sandbox Code Playgroud)
这打印:
func here
func here
func here
func here
func here
func here
Run Code Online (Sandbox Code Playgroud)
可以看出,由于函数到函数指针的衰减cppreference,大多数时候可以使用函数来代替函数指针。
函数类型 T 的左值可以隐式转换为指向该函数的纯右值指针。这不适用于非静态成员函数,因为不存在引用非静态成员函数的左值。
但除此之外,函数指针看起来也可以用来代替函数,因为我可以使用它来调用函数而无需显式取消引用。
另请注意,您不需要使用一元 * 来通过函数指针进行调用;两者 (*p1_foo)(); 和 (p1_foo)(); 由于函数到函数指针的转换,具有相同的结果。
还有一个双重的便利:调用位置的函数指针会自动转换为函数值,因此您不必编写 * 来通过函数指针进行调用。
让它看起来好像存在一个隐式函数指针来进行函数转换。