如何解决为我的结构分配内存失败,出现段错误,未知地址
很难简短描述。
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 举报,一经查实,本站将立刻删除。