gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:43:40 25 4
gpt4 key购买 nike

我使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com