Arrays 为我的结构分配内存失败,segfault,地址未知

Arrays 为我的结构分配内存失败,segfault,地址未知,arrays,c,pointers,segmentation-fault,Arrays,C,Pointers,Segmentation Fault,很难给出一个简短的描述 我的队列。h: 。。。 #在每个字符串中定义最大字符串长度1025//个字符 #定义最大队列容量20//队列容量 #定义未初始化的-1000 类型定义结构 { 字符*名称; char(*data)[MAX_STRING_LENGTH];//声明一个 //可以指向整个数组 int头; 内尾; 整数计数; int是安全的; 可用的扫描项目; 可用的扫描空间; sem_t互斥体; }排队; ... 以下是我以前的做法: my_queue.c: 。。。 队列*使队列(字符*名称

很难给出一个简短的描述

我的队列。h:

。。。
#在每个字符串中定义最大字符串长度1025//个字符
#定义最大队列容量20//队列容量
#定义未初始化的-1000
类型定义结构
{
字符*名称;
char(*data)[MAX_STRING_LENGTH];//声明一个
//可以指向整个数组
int头;
内尾;
整数计数;
int是安全的;
可用的扫描项目;
可用的扫描空间;
sem_t互斥体;
}排队;
...
以下是我以前的做法:

my_queue.c:

。。。
队列*使队列(字符*名称、整数大小、整数安全)
{
queue*new=malloc(sizeof(queue));
新建->名称=名称;
新建->是否安全=是否安全;
新建->头部=0;
新建->计数=0;
...
我根本没有初始化
queue->data
,而是开始写入它 在我的队列推送中:

strcpy(q->data[q->tail], str);
这个(或者类似的东西,我得回去检查一下) 以前可以工作,但我决定重新工作队列的实现 因为我意识到我误解了我的要求,我想 队列根据需要增长,而不是静态调整大小

当时,我对队列->数据进行了不同的定义,作为二维字符数组, 而不是指针。(类似于
字符数据[MAX\u QUEUE\u CAPACITY][MAX\u STRING\u LENGTH]
)。作为使队列动态化的一部分,我尝试使用指向一组数组的指针,而不是二维字符数组

现在,当我尝试在
queue\u push
中运行该行时,我看到了segfaults。我认为可能是一些不同的问题(各种数组初始化问题),但我使用了AddressSanitarizer,我认为我已经将其缩小到地址0x0000…,这似乎是由于我的malloc'ing队列->数据错误造成的问题

地址消毒液:DEADLYSIGNAL ================================================================= ==245048==错误:地址消毒器:未知地址0x000000000000上的SEGV(pc 0x7fdec87b4e1f bp 0x7ffe5cab87b0 sp 0x7ffe5cab7f20 T0) ==245048==该信号是由读取内存访问引起的。 ==245048==提示:地址指向零页。 #0 0x7fdec87b4e1e(/lib/x86_64-linux-gnu/libasan.so.5+0x9be1e) #队列中的1 0x55e94a06dcca_push/home/brian/Workspace/MT dns解析器/MT cirque.c:102 #2 0x55e94a06c895位于main/home/brian/Workspace/MT dns解析器/多重查找中。c:28 #3 0x7fdec854e0b2位于libc_start_main(/lib/x86_64-linux-gnu/libc.so.6+0x270b2)中 #4 0x55e94a06c6ad处于启动状态(/home/brian/Workspace/MT dns解析器/多重查找+0x26ad)

我曾想过可能单独对队列->数据进行malloc'ing,但如果合适的话,我不知道该怎么做

我的代码可能有一些问题,因为我已经很快地引导自己编写了C。显而易见的是,
strcpy
可能无法与指向字符数组的指针一起工作?我在这个问题上反复讨论,我看到人们有类似的问题,但不完全是这样

请原谅。如果你需要更多信息或者我犯了一个明显的错误,请告诉我,但是


…您认为我在这里做错了什么?谢谢。

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

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
可以用作字符串数组。

q->data
是一个指针,但你永远不会让它指向任何地方。当取消引用该指针时,它会导致未定义的行为,很可能会崩溃。所有指针都必须初始化为实际指向某个地方。好的。我明白这一点。一个较小的域我脑子里有n个问题。考虑到它是这个结构的一个成员,它本身已经被分配到了某个地址,我应该指出什么呢?正如我提到的,我试图为q->数据本身分配内存(将我的
malloc
留给
make_queue
中的队列),我发现了一个奇怪的错误,就是错误地使用了堆。首先,你需要告诉我们
q->data
应该是什么。它应该是一个字符串数组吗?然后你可以做
q->data=malloc(MAX\u QUEUE\u CAPACITY*sizeof*q->data)
分配
最大队列容量
字符串数。它应该是一个字符串数组,是的。您当前对
队列
结构本身的分配是正常的。使用
malloc(sizeof(QUEUE)*size)
你可以创建一个
size
队列数组。太好了!我使用了这一行,它确实起了作用。我不知道为什么以前堆会出现奇怪的错误。出于好奇,为什么它是
sizeof(*new->data)
new->data=malloc(*sizeof(*new->data))中
?为什么新建->数据的值?@BrianPeterson因为
new->data
是指向
char[MAX\u STRING\u LENGTH]
sizeof(*new->data)
将是
sizeof(char[MAX\u STRING\u LENGTH])
。使用指针变量会更短,并且总是正确的。