簡體   English   中英

C - 指向指針數組的指針

[英]C - pointer to array of 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 = "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;
}

改變

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);
}

struct pkt *data; 是一個局部變量,保存它的地址並在作用域結束后使用它,是未定義的行為。 您還需要一個內存區域,您可以在其中保存一些struct pkt* s 而不是struct pkt s。

因為你沒有free任何東西,所以你有一個很大的內存泄漏。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM