#include <stdio.h>
#include <stdlib.h>
#include <systemd/sd-device.h>
int main() {
    sd_device *device;
    sd_device_enumerator *enumerator =NULL;
    const char **subsystem =NULL;
    // *subsystem = malloc(sizeof(char *));
    *subsystem = malloc(500);
    if (subsystem == NULL)
        printf("ohh");
    // Create a device enumerator
    int r = sd_device_enumerator_new(&enumerator);
    if (r< 0)
        printf("unable to create instance");
        printf("%d\n",r);
    //sd_device_enumerator_scan(enumerator);
    for (device = sd_device_enumerator_get_device_first(enumerator); device != NULL;
         device = sd_device_enumerator_get_device_next(enumerator)) {
        
            r = sd_device_get_subsystem(device, subsystem);
            if (r < 0) 
            printf("error in subsystem");
                
                printf(" %s\n", subsystem);
                if (subsystem != NULL) 
                free((char *)subsystem); // free the previous subsystem name
                            
            
}
}

编译上述代码会导致seg错误

gcc -o dev_enum test 2. c-lsystem用于编译 请帮

推荐答案

原因是空指针取消引用,这会调用未定义的行为:

const char **subsystem =NULL;
// *subsystem = malloc(sizeof(char *));
*subsystem = malloc(500);

在第3行中,subsystem被解除引用,这是一个空指针.

根据man page代表sd_device_get_subsystem(),第二个参数需要是char **,所以您只需将subsystem定义为char *,并将&subsystem作为sd_device_get_subsystem()的第二个参数传递.

不过,我相信该函数会将指向的指针更改为指向指定设备记录的内核子系统,这样做时分配的500个字节就会丢失,这里实际需要的只是:

char *subsystem = NULL;
r = sd_device_get_subsystem(device, &subsystem);

手册页对其工作状态保持沉默,并且除了函数返回的内容之外没有解释任何内容.

手册页没有说明有关动态分配的任何内容,因此我假设它是一个subsystem将被设置为指向的static缓冲区,并且代码中不需要任何malloc()/free().

一些其他问题:

  • malloc()和家族在失败时返回空指针.未能判断它可能会因后续空指针反引用而引发未定义行为.打印"ooh"并不能解决这个问题.

  • free()需要一个通用void *,该void *隐式地转换为任何其他指针类型或从任何其他指针类型转换.没有必要将其论点归结为char *.

  • 将日志(log)打印为stdout并不能处理错误.您很难从malloc()故障中恢复,也无法通过在sd_device_enumerator_new()故障后立即拨打sd_device_enumerator_get_device_first()来从sd_device_enumerator_new()故障中恢复.只需退出即可.

编辑:这是它在libsystemd's code中的使用方式:

const char *subsystem;

r = sd_device_get_subsystem(device, &subsystem);

进行一些快速的Google搜索总是有帮助的.:)

C++相关问答推荐

是否定义了数组指针类型转换为指针类型?""""

GCC预处理宏和#杂注GCC展开

这是一个合法的C Strdup函数吗?

不会停在空格或换行符上的错误

正确的TCP/IP数据包 struct

轮询libusb_pollfd struct 列表的正确方式是什么?

C-使用指针返回修改后的整数数组

如何确保在C程序中将包含uft8字符的字符串正确写入MySQL?

C11/C17标准允许编译器清除复合文字内存吗?

C-try 将整数和 struct 数组存储到二进制文件中

在C程序中使用Beaglebone Black UART的问题

C23标准是否向后兼容?

生成一个半RNG,结果用C表示(无随机/随机)

挥发性语义的形式化理解

';malloc():损坏的顶部大小';分配超过20万整数后

I';我试着从.txt文件中读取文本,并用c计算其中的单词数量

如何在Rust中处理C的longjmp情况?

使用 strtok 多次分割一个字符串会导致意外行为

一元运算符

将数组中的所有元素初始化为 struct 中的相同值