C-программирование: полученные данные записываются в указатель - PullRequest
2 голосов
/ 30 ноября 2011

, поэтому у меня есть следующий метод enum в c:

enum enum_type GetInfo (int socket, unsigned char *data)
{
}

и в API я могу найти это:

Полученные данные записываются в указатель * data ....

Итак, если я делаю что-то вроде этого:

unsigned char *data;
enum_type enum1;

enum1 = GetInfo (int socket, data);

Я получил ошибку сегментации.

В чем моя проблема?

Спасибо, Саймон

Ответы [ 4 ]

3 голосов
/ 30 ноября 2011

Ваша проблема в том, что вы не выделили место для data, но попробуйте написать в него. У

unsigned char *data = malloc(sizeof(unsigned char) * MYBUFLENGTH);

и затем передать данные в GetInfo. В конце не забудьте

free(data);

В качестве альтернативы вы можете выделить место в стеке (доступно в C99, некоторые компиляторы поддерживают его как расширение даже в более ранних версиях стандарта C)

unsigned char data[MYBUFLENGTH];

В этом случае вам не нужно беспокоиться об управлении памятью.

2 голосов
/ 30 ноября 2011

вам нужно выделить память для хранения данных. Например:

unsigned char data[10000]; /* allocate 10000 bytes */

enum_type enum1;
enum1 = GetInfo(socket, data);

Если вы не понимаете, что происходит, я рекомендую потратить время на чтение указателей .

1 голос
/ 30 ноября 2011

не уверен, насколько велика информация, но попробуйте следующее

unsigned char data[512] = {0};
enum_type enum1;

enum1 = GetInfo (socket, data);

это гарантирует, что данные указывают на действительный адрес памяти в стеке.

0 голосов
/ 30 ноября 2011

Это может быть потому, что GetInfo хочет записать в буфер, указанный data, и вы просто передаете указатель без выделения пространства памяти. Выделите память и укажите data так:

// I assume you need 1000 bytes
data = (unsigned char*)malloc(1000*sizeof(unsigned char));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...