Передача указателя на массив символов в функцию - PullRequest
1 голос
/ 29 ноября 2009

У меня есть указатель на мой массив символов вроде этого.

    unsigned char *recvBuf;
    recvBuf = (unsigned char *)malloc(sizeof(char)*RECVBUF);

Затем я передаю это функции, определенной как

void setHeader(MyHeader *myHeader, unsigned char *buffer)

Который копирует первые 12 байтов в структуру

Затем я пытаюсь передать его другой функции позже

Record readRecord(unsigned char *buffer, int *arrayPosition, int buffsize)

Но программа всегда перестает отвечать на запросы, когда я пытаюсь получить доступ к любой части массива, используя [], точно так же, как это использовалось в предыдущей функции. И я тоже в порядке, чтобы получить к нему доступ, прежде чем передать его функции.

Идеи будут высоко оценены.

Спасибо

EDIT:

Указатели одинаковы.

Это внутри второй функции

Я добавил этот код в начало, и он отлично работает

int k = *arrayPosition;
    printf("%p \n", buffer);

    printf("%c \n", buffer[k]);

Это оригинальный код, программа перестает отвечать на запросы, после того как я = * расположение массива ...

int i, j;
Record *myRecord;
Resource *myResource;
unsigned char name[255];
unsigned char data[50];
unsigned int offset;

i = *arrayPosition;

while(buffer[i] != '\0')
{
    if((buffer[i] & 0xC000) == 0xC000)
    {

Ответы [ 2 ]

2 голосов
/ 29 ноября 2009

Мне действительно нужно больше контекста, чтобы помочь, нет ничего явно плохого в том, что вы сказали.

Основа:

  1. Убедитесь, что вы не проиндексированы конец вашего блока памяти.
  2. Проверьте, что вы не проходите мимо & recvBuf, где вы хотите пройти recvBuf? Компилятор должен поймайте это, но вы бы испортили свой стек, если бы сделали это, возможно, используя приведение.
1 голос
/ 29 ноября 2009

Входных данных недостаточно, чтобы быть уверенным в проблеме, из-за которой указатель портится, но хорошим уловом было бы проверить с помощью gdb, изменяется ли указатель между вызовом функции, который вы описали.

Вы модифицируете какой-либо символ массива? В этом случае вы должны разыменовать указатель с помощью *.

Если вы не можете использовать указатель после того, как причина вызова может быть:

  1. ошибочно изменяется внутри функции
  2. это указатель на выделенное значение в стеке, которое неявно где-то освобождается (но звучит странно)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...