小编San*_*war的帖子

在C中,我如何选择是返回结构还是指向结构的指针?

最近在我的C肌肉上工作,并查看我一直在使用它的许多图书馆,这当然让我很好地了解了什么是好的做法.我没见过的一件事是一个返回结构的函数:

something_t make_something() { ... }
Run Code Online (Sandbox Code Playgroud)

从我所吸收的,这是"正确"的方式:

something_t *make_something() { ... }
void destroy_something(something_t *object) { ... }
Run Code Online (Sandbox Code Playgroud)

代码片段2中的体系结构比片段1更受欢迎.所以现在我问,为什么我会直接返回一个结构,就像在代码片段1中一样?当我在两种选择中做出选择时,我应该考虑哪些差异?

此外,该选项如何比较?

void make_something(something_t *object)
Run Code Online (Sandbox Code Playgroud)

c malloc struct pointers

54
推荐指数
4
解决办法
5310
查看次数

此C继承实现是否包含未定义的行为?

struct parent
{
    char a;
    char b;
};

struct child
{
    struct parent parent;
    int c;
    char d;
};

struct grandchild
{
    struct child child;
    long e;
};

void print_parent_val(struct parent *p)
{
    printf("%d\n", p->a);
}

int main (int argc, char **argv)
{
    struct grandchild g;
    g.child.parent.a = 69;
    print_parent_val((struct parent *)&g);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

程序编译(没有警告)并运行正常并按69预期打印.我从未见过任何实现此继承技术的代码,因此我非常犹豫地认为这是"好".

编辑:如何将孙子变成一个孩子?中期转换也可能吗?

void print_parent_val(struct child *c)
{
    printf("%c\n", c->d);
}

int main (int argc, char **argv)
{
    struct grandchild g;
    g.child.parent.a = …
Run Code Online (Sandbox Code Playgroud)

c struct language-lawyer

7
推荐指数
1
解决办法
126
查看次数

1.10:不能在共享库中隐式包含运行时/ cgo

我正在尝试执行,go build -buildmode=shared -linkshared test但出现错误:

go 1.10: cannot implicitly include runtime/cgo in a shared library
Run Code Online (Sandbox Code Playgroud)

我那个包里只有一个文件

lib.go

package test
import "fmt"
func Hello() {
    fmt.Println("Hi")
}
Run Code Online (Sandbox Code Playgroud)

我在运行go1.10.4 linux / amd64的linux机器上

go

7
推荐指数
1
解决办法
154
查看次数

是否应将所有预期从二进制读取的结构标记为已打包?

我知道有些结构,可能会,也可能不会,在元素之间添加填充.

我当前的项目是从/ dev/input文件读取输入.这些文件的二进制布局定义<linux/input.h>如下:

struct input_event {
    struct timeval time;
    __u16 type;
    __u16 code;
    __s32 value;
};
Run Code Online (Sandbox Code Playgroud)

我想知道这个结构没有标记打包属性.这意味着/ dev/input文件(逐位打包)不能保证与struct相同的包匹配.因此逻辑

struct input_event event;
read(fd, &event, sizeof(event));
Run Code Online (Sandbox Code Playgroud)

未定义为跨所有拱门工作.

我的逻辑中有谬误吗?或者可以安全地假设某些事情不会被打包?

c memory io data-structures

6
推荐指数
1
解决办法
113
查看次数

在Git中,如何提交文件一次,但忽略对文件的进一步更改

我有一个日志文件errors.log,软件用来报告错误.该软件本身不会创建errors.log,因此该文件必须事先存在.

问题是,如果我添加它,.gitignore那么开发人员需要在他们的机器上手动创建它.如果我不忽略它,那么每个开发人员都会errors.log在测试后提交他们自己的内容......在合并时证明了一个很大的麻烦.

如何使新开发人员errors.log在最初克隆它时获取空白副本,但是在使用时不会将其添加到工作树(无论更改)git add -A

git

6
推荐指数
1
解决办法
930
查看次数

直接写入/dev/input/event5,写入字符设备文件

我的键盘有音量控制。我正在尝试直接触发/模拟音量增大事件。使用xxd -c 24 event5,我可以监视文件包含的内容。当我使用实际的音量按钮时,它会正常触发它。下面是一个 C 脚本,它写入按钮发送的确切数据。

int main()
{
    int f = open("/dev/input/event5", O_WRONLY);
    if(f == -1)
    {
        perror("Could not open event5");
        return 1;
    }
    struct input_event e;
    gettimeofday(&e.time, 0);
    e.type = 0x0400;
    e.code = 0x0400;
    e.value = 0x0e9000c00;
    write(f, &e, sizeof(e));

    gettimeofday(&e.time, 0);
    e.type = 0x0100;
    e.code = 0x7300;
    e.value = 0x01000000;
    write(f, &e, sizeof(e));

    gettimeofday(&e.time, 0);
    e.type = 0x0000;
    e.code = 0x0000;
    e.value = 0x00000000;
    write(f, &e, sizeof(e));
    return 0;

}
Run Code Online (Sandbox Code Playgroud)

但是xxd -c 24 event5 …

c linux file input

5
推荐指数
0
解决办法
1859
查看次数

如何使用用户密码进行aes加密?

当ecryptfs等软件使用AES时,它会要求输入用户密码(例如"password123").

AES算法本身不需要用户密码.那么"password123"在哪里被投入数学?

我正在努力创建一个使用密码加密某些数据的C函数.我知道使用OpenSSL和aes密钥执行此操作的典型方法,但我不知道如何集成用户密码.

c security encryption cryptography ecryptfs

0
推荐指数
1
解决办法
248
查看次数