c - 将字符串与 libusb 一起使用会导致段错误

标签 c string libusb

我使用 netbeans 和 gcc 进行编译。当我运行附加的代码时,出现错误: 运行完成;分段故障;核心已转储;实时:310ms;用户:40ms;系统:10ms

如果“char stringData”被注释掉,则不存在段错误。此外,如果删除 libusb_get_device_descriptor (以及随附的结构引用),则不会出现段错误。

如果它在 Debug模式下运行,则会给出错误消息:

#error "Never use <bits/string_fortified.h> directly; include <string.h> instead."

我看不出它们如何相互影响。

#include <stdio.h>
#include <stdlib.h>
#include <libusb.h>
#define DATLENGTH 15

int main() {
    libusb_context *context;
    int i; 
    libusb_device **list;
    libusb_device *device;
    const struct libusb_version *libVersion;
    ssize_t numDev = 0;
    struct libusb_device_descriptor *dev_descriptor;
    struct libusb_config_descriptor *config;
    libusb_device_handle * dev_handle;
    char stringData[DATLENGTH];

    libusb_init(&context);


    libVersion = libusb_get_version();
    printf("Library Version: %i.%i.%i.%i\n", (int)libVersion->major, (int)libVersion->minor, (int)libVersion->micro, (int)libVersion->nano);

    numDev = libusb_get_device_list(context, &list);    
    if(numDev < 0){
        printf("Error %i\n", numDev);
        return -1;
    }
    else{
        printf("Number of devices: %i\n\n", numDev);
    }

    for(i=0;i<numDev;i++){    
        device = list[0];

        struct libusb_device_descriptor *dev_descriptor;

        libusb_get_device_descriptor(device, dev_descriptor);
        printf("Device #:  %i\n", i);
        printf("idVendor:  %04x\n", (dev_descriptor->idVendor & 0x0000FFFF));
        printf("idProduct: %04x\n", (dev_descriptor->idProduct & 0x0000FFFF));
        printf("Number of Configurations: %i\n", dev_descriptor->bNumConfigurations);
        libusb_open(device, &dev_handle);
        libusb_get_string_descriptor_ascii(dev_handle, dev_descriptor->iManufacturer, stringData, DATLENGTH);
        printf("Manufacturer ID: %s\n", stringData);        
        libusb_get_string_descriptor_ascii(dev_handle, dev_descriptor->iProduct, stringData, DATLENGTH);
        printf("Product ID: %s\n", stringData);       


        printf("\n");
        }

        libusb_free_device_list(list, 1); 

        libusb_exit(context);

    return (EXIT_SUCCESS);
}

最佳答案

您正在通过以下方式产生未定义的行为:

struct libusb_device_descriptor *dev_descriptor;
libusb_get_device_descriptor(device, dev_descriptor);

dev_descriptor 应该是指向 struct libusb_device_descriptor 的指针。但它是一个指向任何地方的指针,因为你从未初始化它。当 libusb_get_device_descriptor 尝试在结构中存储信息时,它将出现段错误或覆盖随机内存。

您应该将其更改为:

struct libusb_device_descriptor dev_descriptor;
libusb_get_device_descriptor(device, &dev_descriptor);

它实际上在堆栈上分配一个struct libusb_device_descriptor,然后传递该结构的地址。请注意,您必须将 dev_descriptor->field 始终更改为 dev_descriptor.field

关于c - 将字符串与 libusb 一起使用会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53808111/

相关文章:

java - 贝塞尔低通算法

c - 包含 2 个文件的 Makefile

python - 如何在python中将集合元素添加到字符串

c# - 删除字符串中分隔符之间的文本(使用正则表达式?)

python - 设备在 PyUSB 上不可用

c - 来自标准输入的存储行永远不会改变

c - 用数组常量定义的枚举

java - 我的 Java 数学运算出现错误?

c - libusb怎么能看懂开始阅读呢?

python - USB - 同步与异步与半异步