小编R..*_*R..的帖子

使用malloc()和sizeof()在堆上创建结构

我正在尝试使用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是一个空白,但我不明白为什么......

c++

4
推荐指数
2
解决办法
2万
查看次数

是否有支持每个__attribute__的最低gcc版本的列表?

此处的官方文档仅列出了极少数属性的最低要求版本:

http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

是否有每个属性添加到哪个版本的完整列表?甚至更好的是一个列表,该列表还显示哪些与pcc和tcc兼容。

c attributes gcc

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

浮点异常 - gcc bug?

请考虑以下代码:

#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.更改第二行maindouble x = 1.0/0.0;给出预期的行为.这是允许的,还是一个bug?

编辑:对于它的价值,起初似乎在大多数现实世界的代码中,可能导致引发fenv异常的操作无法优化,因此可以安全地执行大型计算并在最后检查是否存在溢出,div-by-zero等发生了.但是,当您考虑内联和优化时,事情会变得混乱,并且会出现真正的问题.如果这样的函数在由于常量参数而总是最终除以零的情况下被内联,则gcc可能变得非常聪明并且基本上优化整个内联函数而return INFINITY;不会引发任何异常.

c floating-point standards gcc fenv

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

如何关闭write()系统调用的缓冲?

我曾经认为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)

c sockets linux io

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

为什么我可以获取寄存器变量的地址?

引自"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++

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

用于增加位大小的有效条件

假设我有一个递增的无符号整数序列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].有什么想法吗?

c algorithm bit-manipulation

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

传递size_t作为参数的"效率"

由于size_t可以是32位或64位,具体取决于当前系统,最好始终将size_t作为参考或const引用传递给函数,因此它总是4个字节?(如果它是8个字节你必须复制)我看过的很多开源代码都没有这样做,但是如果它们的编译器支持64位整数,那些64位整数总是作为引用传递.他们为什么不为size_t这样做呢?我想知道你的意见是什么.

c++ size-t

3
推荐指数
2
解决办法
2120
查看次数

GNU编译器优化

我对编译器知之甚少,但知道它们很复杂,足够聪明,可以优化代码.假设我的代码看起来像这样:

 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比较?

c++ compiler-construction optimization gcc

3
推荐指数
2
解决办法
542
查看次数

是否有工具来获取ELF .o或可执行文件中特定符号的信息?

我正在寻找一种方便的方法(用于构建测试脚本)来查询目标文件中的各个符号.是否有一个工具可以回答问题(最好是通过退出状态)"文件Y中是否存在符号X?" 或者我只需要解析输出nm(1),例如grep和适当的正则表达式?如果这样的工具可以提供关于符号(大小,类型,值,......)的详细信息,那就更好了.

c linux elf binutils

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

为什么++ i比i ++更有效?

根据谷歌C++样式指南,"当忽略返回值时,'pre'形式(++i)的效率永远不会低于'post'形式(i++),并且效率通常更高."

该指南继续解释原因,但我不完全理解.思考?也许有人可以提供这个概念的例子?

c++ for-loop while-loop do-while

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