微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为我的结构分配内存失败,出现段错误,未知地址

如何解决为我的结构分配内存失败,出现段错误,未知地址

很难简短描述。

my_queue.h:

...
#define MAX_STRING_LENGTH 1025 // characters in each string
#define MAX_QUEUE_CAPACITY 20  // queue capacity
#define UNINITIALIZED -1000

typedef struct
{
    char *name;
    char (*data)[MAX_STRING_LENGTH]; // declare a pointer that
                                     // can point to whole array
    int head;
    int tail;
    int count;
    int is_mt_safe;
    sem_t items_available;
    sem_t space_available;
    sem_t mutex;
} queue;
...

这是我以前的做法:

my_queue.c:

...
queue *make_queue(char *name,int size,int mt_safe)
{
    queue *new = malloc(sizeof(queue));
    new->name = name;
    new->is_mt_safe = mt_safe;
    new->head = 0;
    new->count = 0;
    ...

我根本没有初始化queue->data。相反,我才开始写 在my_queue_push中:

strcpy(q->data[q->tail],str);

这个(或类似的东西,我必须回去检查一下) 曾经工作过,但是我决定重新整理队列的实现 因为我意识到自己对自己的要求有误解,所以我想 队列会根据需要增长,而不是固定大小。

那时候,我将queue->数据定义为二​​维char数组, 而不是指针。 (类似于char data[MAX_QUEUE_CAPACITY][MAX_STRING_LENGTH])。作为使队列动态化的一部分,我尝试使用指向一组数组的指针而不是二维char数组。

现在,当我尝试在queue_push中运行该行时,我看到段错误。我以为可能是几个不同的问题(各种数组初始化问题),但是我使用了AddressSanitizer,我想我将其范围缩小到了0x0000 ...,这似乎与我的malloc分配队列问题有关- >数据错误

AddressSanitizer:DEADLYSIGNAL ================================================== =============== == 245048 ==错误:AddressSanitizer:未知地址上的SEGV 0x000000000000(pc 0x7fdec87b4e1f bp 0x7ffe5cab87b0 sp 0x7ffe5cab7f20 T0) == 245048 ==该信号是由READ存储器访问引起的。 == 245048 ==提示:地址指向零页面。 #0 0x7fdec87b4e1e(/lib/x86_64-linux-gnu/libasan.so.5+0x9be1e) #1 0x55e94a06dcca在queue_push /home/brian/Workspace/MT-dns-resolver/mt-cirque.c:102中 #2 0x55e94a06c895在main /home/brian/Workspace/MT-dns-resolver/multi-lookup.c:28 __libc_start_main中的#3 0x7fdec854e0b2(/lib/x86_64-linux-gnu/libc.so.6+0x270b2) _start中的#4 0x55e94a06c6ad(/ home / brian / Workspace / MT-dns-resolver / multi-lookup + 0x26ad)

我想到了可能分别malloc分配queue->数据,但是我想不出适当的方法

由于我引导自己很快编写了C语言,因此我的代码可能存在一些问题。显而易见的事情是strcpy可能不适用于指向char数组的指针吗?我对此进行了反复讨论,我看到人们遇到的问题与SO类似,但不完全相同。

请原谅。让我知道您是否需要更多信息,或者我犯了一个明显的错误,但是...

...我在这里做错了,你认为呢?谢谢。

解决方法

您还需要为数据分配空间,否则data指针将不会指向任何有用的地方:

queue *make_queue(char *name,int size,int mt_safe)
{
    // Allocate memory for the structure itself
    queue *new = malloc(sizeof *new);

    // Allocate memory for the strings in the queue
    // There will be `size` elements in the array of strings
    new->data = malloc(size * sizeof *new->data);

    ...
}

q->data之后可以用作字符串数组。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。