Я получаю ошибку сегментации в коде, который пытается инициализировать структуру указателей на контекст и сокет 0mq. Закомментированный код в основном методе работает, но он использует только локальные переменные. Я хотел бы инициализировать их и передать их в структуре, но мой google foo не дает мне понять, как это сделать правильно.Хранение указателей void в структуре
#include "zhelpers.h"
#include <stdio.h>
#include <stdlib.h>
#include <zmq.h>
struct publisher{
void *handle;
void *context;
};
void init_publisher(struct publisher *p);
void destroy_publisher(struct publisher *p);
void publish(struct publisher *p,char *msg);
void init_publisher(struct publisher *p)
{
p = (struct publisher *)malloc(sizeof(struct publisher));
p->context = malloc(sizeof(void *));
p->handle = malloc(sizeof(void *));
void *context = zmq_ctx_new();
void *handle = zmq_socket(context,ZMQ_PUB);
zmq_bind(handle, "tcp://*:5556");
zmq_bind(handle, "ipc://feed.ipc");
p->context = context;
p->handle = handle;
}
void destroy_publisher(struct publisher *p)
{
zmq_close(p->handle);
zmq_ctx_destroy(p->context);
free(p->handle);
free(p->context);
free(p);
}
void publish(struct publisher *p,char *msg)
{
s_send(p->handle, msg);
}
int main(void)
{
/**
void *context = zmq_ctx_new();
void *publisher = zmq_socket(context, ZMQ_PUB);
int rc = zmq_bind(publisher, "tcp://*:5556");
assert(rc == 0);
rc = zmq_bind(publisher, "ipc://weather.ipc");
assert(rc == 0);
printf("Started Weather Server...\n");
srandom((unsigned) time (NULL));
int zipcode, temperature, relhumidity;
zipcode = randof(100000);
temperature = randof (215) - 80;
relhumidity = randof (50) + 10;
char update[20];
sprintf(update, "%05d %d %d", zipcode, temperature, relhumidity);
s_send(publisher, update);
zmq_close(publisher);
zmq_ctx_destroy(context);
*/
struct publisher *p;
init_publisher(p);
printf("Setup pub\n");
srandom((unsigned) time (NULL));
int zipcode, temperature, relhumidity;
zipcode = randof(100000);
temperature = randof (215) - 80;
relhumidity = randof (50) + 10;
char update[20];
sprintf(update, "%05d %d %d", zipcode, temperature, relhumidity);
publish(p,update);
printf("Published Message\n");
destroy_publisher(p);
printf("Destroyed publisher\n");
return 0;
}
Избегайте указателей пустоты, которые имеют определенное кольцо об этом –
['p = (struct publisher *) malloc (sizeof (struct publisher));' ---> 'p = malloc (sizeof (struct publisher)); '] (http://stackoverflow.com/a/605858/1983495) Одна из проблем заключается в том, что вы не проверяете, не' 'malloc()' не возвратил 'NULL'. Другая проблема заключается в том, что вы не знаете, где именно происходит сбой кода, используйте отладчик. –
@iharob сбой в коде zeromq. Но вызовы на самом деле инициализировать указатели void одинаковы в обоих случаях. Поэтому мне кажется, что я неправильно настраиваю структуру, потому что она не вызывает никаких ошибок, если я выполняю всю работу в основном методе (код с комментариями). –