C-指向指针数组的指针

C-指向指针数组的指针,c,arrays,pointers,segmentation-fault,C,Arrays,Pointers,Segmentation Fault,我必须存储数据结构的指针。 所以,我需要一个指针数组 我创建了一个简单的示例,但收到了一个分段错误。 为什么我做不到 buf->data[i]=pkt #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #define MAX_SIZE 500000 #define MAX_CHAR 1024 char *string = "H

我必须存储数据结构的指针。 所以,我需要一个指针数组

我创建了一个简单的示例,但收到了一个
分段错误
。 为什么我做不到

buf->data[i]=pkt

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#define MAX_SIZE    500000
#define MAX_CHAR    1024

char *string = "HelloHelloHello";

struct pkt {
    char *buf;
    int seq;
};

struct buffer {
    int a;
    int b;
    struct pkt **data;
};


struct buffer *new_buffer() {
    struct buffer *new;

    new = malloc(sizeof(struct buffer) * MAX_SIZE);
    if (new == NULL) {
        perror("malloc(buffer)");
        exit(EXIT_FAILURE);
    }

    struct pkt *data;
    data = malloc(sizeof(struct pkt) * MAX_SIZE);
    if (data == NULL) {
        perror("malloc(data)");
        exit(EXIT_FAILURE);
    }

    new->data = &data;

    new->a = 0;
    new->b = 0;

    return new;
}

struct pkt *new_pkt(char *data, int seq) {
    struct pkt *pkt;

    pkt = malloc(sizeof(struct pkt));
    if (pkt == NULL) {
        perror("malloc(pkt)");
        exit(EXIT_FAILURE);
    }

    pkt->buf = malloc(sizeof(char) * MAX_CHAR);
    if (pkt->buf == NULL) {
        perror("malloc(pkt->buf)");
        exit(EXIT_FAILURE);
    }

    strncpy(pkt->buf, data, MAX_CHAR);
    pkt->seq = seq;

    return pkt;
}

void add_pkt(struct pkt *pkt, struct buffer *buf, int i) {
    buf->data[i] = pkt;  //segmentation fault
}


int main() {
    struct buffer *my_buffer = new_buffer();
    struct pkt *pkt;
    int i;

    for(i=0; i<MAX_SIZE; ++i) {
        pkt = new_pkt(string, i);
        add_pkt(pkt, my_buffer, i);
        printf("[%d]", i);
    }

    return 0;
}
#包括
#包括
#包括
#包括
#定义最大尺寸500000
#定义最大字符1024
char*string=“hellohello”;
结构程序包{
char*buf;
内部顺序;
};
结构缓冲区{
INTA;
int b;
结构pkt**数据;
};
结构缓冲区*新缓冲区(){
结构缓冲区*new;
新=malloc(sizeof(结构缓冲区)*最大大小);
if(new==NULL){
perror(“malloc(缓冲区)”);
退出(退出失败);
}
结构pkt*数据;
数据=malloc(sizeof(struct pkt)*最大尺寸);
如果(数据==NULL){
perror(“malloc(数据)”);
退出(退出失败);
}
新建->数据=&数据;
新建->a=0;
新建->b=0;
归还新的;
}
结构组件*新组件(字符*数据,整数顺序){
结构pkt*pkt;
pkt=malloc(sizeof(struct-pkt));
如果(pkt==NULL){
perror(“malloc(pkt)”);
退出(退出失败);
}
pkt->buf=malloc(sizeof(char)*MAX_char);
如果(pkt->buf==NULL){
perror(“malloc(pkt->buf)”;
退出(退出失败);
}
strncpy(pkt->buf,数据,最大字符);
pkt->seq=seq;
返回包装;
}
void add_pkt(struct pkt*pkt,struct buffer*buf,int i){
buf->data[i]=pkt;//分段错误
}
int main(){
struct buffer*my_buffer=new_buffer();
结构pkt*pkt;
int i;
对于(i=0;i变化

struct pkt*data;
是一个局部变量,保存其地址并在作用域结束后使用它是未定义的行为。另外,您需要一个内存区域,可以在其中保存一些
struct pkt*
s,而不是
struct pkt
s


因为你没有
空闲
任何东西,你有一个很大的内存泄漏。

也许你应该把内存分配给
数据
。我刚刚用
data=malloc(sizeof(…);
new->data=&data
无需进行快速调试,DCV。
struct pkt *data;
data = malloc(sizeof(struct pkt) * MAX_SIZE);
if (data == NULL) {
    perror("malloc(data)");
    exit(EXIT_FAILURE);
}

new->data = &data;
new->data = malloc(sizeof(struct pkt*) * MAX_SIZE);
if (new->data == NULL) {
    perror("malloc(new->data)");
    exit(EXIT_FAILURE);
}