Проблема с указателем копирования в C - PullRequest
0 голосов
/ 09 января 2011

Я радикально отредактировал вопрос, чтобы лучше объяснить свое приложение, так как составленный мною пример был неверен во многих отношениях, как вы указали:

У меня есть один указатель на символ и я хочускопируйте его в другой указатель, а затем добавьте символ NULL в конце (в моем реальном приложении первая строка является константой, поэтому я не могу ее изменить, поэтому мне нужно ее скопировать).

Iу меня есть эта функция, «MLSLSerialWriteBurst», которую я должен заполнить некоторым кодом, адаптированным для моего микроконтроллера.

tMLError MLSLSerialWriteBurst( unsigned char slaveAddr, 
                           unsigned char registerAddr, 
                           unsigned short length, 
                           const unsigned char *data )
{
unsigned char *tmp_data;

  tmp_data = data;
  *(tmp_data+length) = NULL;

  // this function takes a tmp_data which is a char* terminated with a NULL character ('\0')
  if(EEPageWrite2(slaveAddr,registerAddr,tmp_data)==0)
    return ML_SUCCESS;
  else 
    return ML_ERROR;
}

Я вижу, что здесь есть проблема: факт, что я не инициализирую tmp_data, но я не могу знать,длина.

Ответы [ 2 ]

3 голосов
/ 09 января 2011

Для начала, вам не хватает связки объявлений в вашем коде.Например, что такое лунга?Кроме того, я предполагаю, что вы инициализировали два ваших указателя, чтобы они указывали на память, которую вы можете использовать.Однако, возможно, это неверное предположение.

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

Кажется, здесь много ошибок.Трудно понять, с чего начать.Это действительно то, на что похож ваш настоящий код?Я не думаю, что он даже скомпилируется.

Наконец, в вашей терминологии, похоже, есть некоторая путаница.Копирование указателя отличается от копирования памяти, на которую указывает.Указатель является адресом памяти.Если вы просто скопируете указатель, то оба указателя будут ссылаться на один и тот же адрес.

Я бы создал копию строки, используя код, подобный следующему:

char *from_string = "ciao";
char *to_string;
int len;

len = strlen(from_string);
to_string = (char *)malloc(len + 1);
if (to_string != NULL)
    strcpy(to_string, from_string);
0 голосов
/ 09 января 2011

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

Когда вы говорите tmp_data = data, вы указываете tmp_data на ту же память, на которую указывает data.Вместо этого вам нужно выделить новый блок памяти и скопировать в него память из data.

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

unsigned char * tmp_data = malloc(length + 1);
if(tmp_data != 0) {
    memcpy(tmp_data, data, length);
    tmp_data[length] = 0;
    // ...
    free(tmp_data);
}

Вы также можете использовать массив стека фиксированного размера:

unsigned char tmp_data[256];
if(length >= sizeof(tmp_data)) length = sizeof(tmp_data) - 1;
memcpy(tmp_data, data, length); // or equivalent routine
tmp_data[length] = 0;

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

unsigned char tmp_data[length];
memcpy(tmp_data, data, length); // or equivalent routine
tmp_data[length] = 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...