我正在尝试使用malloc()和sizeof()在堆上创建一个结构.这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Employee
{
char first[21];
char last[21];
char title[21];
int salary;
};
struct Employee* createEmployee(char* first, char* last, char* title, int salary) // Creates a struct Employee object on the heap.
{
struct Employee* p = malloc(sizeof(struct Employee));
if (p != NULL)
{
strcpy(p->first, first);
strcpy(p->last, last);
strcpy(p->title, title);
p->salary, salary;
}
return p;
}
Run Code Online (Sandbox Code Playgroud)
没有我的编译器(Visual C++)告诉我该行struct Employee* p = malloc(sizeof(struct Employee));"void*"无法转换为"Employee*"类型.我不知道这里有什么问题.似乎struct Employee是一个空白,但我不明白为什么......
此处的官方文档仅列出了极少数属性的最低要求版本:
http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
是否有每个属性添加到哪个版本的完整列表?甚至更好的是一个列表,该列表还显示哪些与pcc和tcc兼容。
请考虑以下代码:
#include <fenv.h>
#include <stdio.h>
int main()
{
#pragma STDC FENV_ACCESS ON
1.0/0.0;
printf("%x\n", fetestexcept(FE_ALL_EXCEPT));
}
Run Code Online (Sandbox Code Playgroud)
我希望它打印一个非零值对应FE_DIVBYZERO,但它打印0.更改第二行main以double x = 1.0/0.0;给出预期的行为.这是允许的,还是一个bug?
编辑:对于它的价值,起初似乎在大多数现实世界的代码中,可能导致引发fenv异常的操作无法优化,因此可以安全地执行大型计算并在最后检查是否存在溢出,div-by-zero等发生了.但是,当您考虑内联和优化时,事情会变得混乱,并且会出现真正的问题.如果这样的函数在由于常量参数而总是最终除以零的情况下被内联,则gcc可能变得非常聪明并且基本上优化整个内联函数而return INFINITY;不会引发任何异常.
我曾经认为write()系统调用是无缓冲的,fwrite并且fread用于缓冲IO.但是我写了一些简单的程序来确定在使用时仍然会进行一些缓冲write().我正在使用write()和read()插座.由于缓冲,客户端可能会在服务器不断发送数据包时滞后.我不要那个.我希望客户端必须在服务器发送更多记录之前使用该记录.
如何在不增加网络负载的确认等的情况下实现这一目标!
我在linux上使用gcc
server.c:
#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <netinet/in.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <netinet/tcp.h>
int remote_rr_port=2000; // Server will send RR logs using connection on this port.
char const *remote_server_ip="127.0.0.1";
int connFD_rr;
static void startTcpServer(int *sd, const int port) {
*sd= socket(AF_INET, SOCK_STREAM, 0);
// Set socket option so that port can be reused
int enable …Run Code Online (Sandbox Code Playgroud) 引自"Thinking in c ++"一书关于寄存器变量的部分:"寄存器变量的使用存在限制.你不能获取或计算寄存器变量的地址.一个寄存器变量只能在一个块中声明(你不能有全局或静态寄存器变量.)"
所以我写了这段程序来测试:
int global = 2;
// error
// register int global2 = 3;
int main() {
register int local2 = 2;
cout << local2 << " " << &local2 << endl;
}
Run Code Online (Sandbox Code Playgroud)
但是g ++没有生成错误,打印出local2的地址.那么为什么我可以在没有错误的情况下获取地址?
假设我有一个递增的无符号整数序列C[i].随着它们的增加,它们可能会占据越来越多的位.我正在寻找一个有效的条件,纯粹基于序列的两个连续元素C[i]和C[i+1](过去和未来的元素是不可观察的),每次所需的位数增加时,它将精确地或近似地评估为真.
条件的一个明显(但缓慢)的选择是:
if (ceil(log(C[i+1])) > ceil(log(C[i]))) ...
Run Code Online (Sandbox Code Playgroud)
以及使用特殊cpu操作码计算前导零位数的任何事情(更好但仍然不是很好).
我怀疑可能有一个很好的解决方案涉及一个表达式,只使用按位或按位和值C[i+1]和C[i].有什么想法吗?
由于size_t可以是32位或64位,具体取决于当前系统,最好始终将size_t作为参考或const引用传递给函数,因此它总是4个字节?(如果它是8个字节你必须复制)我看过的很多开源代码都没有这样做,但是如果它们的编译器支持64位整数,那些64位整数总是作为引用传递.他们为什么不为size_t这样做呢?我想知道你的意见是什么.
我对编译器知之甚少,但知道它们很复杂,足够聪明,可以优化代码.假设我的代码看起来像这样:
string foo = "bar";
for(int i = 0; i < foo.length(); i++){
//some code that does not modify the length of foo
}
Run Code Online (Sandbox Code Playgroud)
GNU编译器是否足够聪明,可以意识到在foo此循环过程中长度不会改变并用foo.length()适当的值替换调用?或者会foo.length()被称为每次i比较?
我正在寻找一种方便的方法(用于构建测试脚本)来查询目标文件中的各个符号.是否有一个工具可以回答问题(最好是通过退出状态)"文件Y中是否存在符号X?" 或者我只需要解析输出nm(1),例如grep和适当的正则表达式?如果这样的工具可以提供关于符号(大小,类型,值,......)的详细信息,那就更好了.
根据谷歌C++样式指南,"当忽略返回值时,'pre'形式(++i)的效率永远不会低于'post'形式(i++),并且效率通常更高."
该指南继续解释原因,但我不完全理解.思考?也许有人可以提供这个概念的例子?