2009-11-29 2 views
1

У меня есть указатель на мой массив символов, подобный этому.Передача указателя на массив символов функции

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) 

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

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

Благодаря

EDIT:

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

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

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

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

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

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

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) 
    { 
+0

Вы уверены, что не изменяете значение указателя внутри одной из функций? Вы разыскиваете указатель при вставке данных? – Jack

+2

Некоторые стилистические проблемы. В C (но не C++) обычно считается, что плохой стиль отличает возвращаемое значение 'malloc', поскольку' void * 'неявно преобразуется в любой другой тип указателя. Кроме того, 'sizeof (char)' всегда 1 в C (и C++), поэтому его умножение избыточно. Вторая строка кода должна быть такой: 'recvBuf = malloc (RECVBUF);'. – bcat

+0

Я думаю, что большинство компиляторов удалит эту избыточность. Иногда он используется для написания более четкого кода: size_of_item * number_of_items – Jack

ответ

2

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

Основа:

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

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

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

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

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