C вопрос, связанный с указателями и массивами

StackOverflow https://stackoverflow.com/questions/3107065

  •  29-09-2019
  •  | 
  •  

Вопрос

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

    #include <stdio.h>
    #include <string.h>
    #include<stdlib.h>

  unsigned char *function1() 
 {
  unsigned char array2[] = { 0x4a,0xb2 };
  return (array2 );

  }

   main()

     {
unsigned char temp[] = { 0xaa, 0x0b, 0x03,0x04,0x05,0x06,0x07,0x08,0x09 };
unsigned char x[2];
unsigned char *packet;
int pkt_len;
pkt_len = sizeof(temp) + sizeof(x);
packet = (unsigned char*) malloc ( pkt_len +1);

memset( packet, 0x00, pkt_len +1);
unsigned char *pointer1 = malloc ( sizeof(temp) + 1);

memset( pointer1, 0x00, sizeof(temp) +1);
memcpy (pointer1, temp, sizeof(temp) );

memcpy (packet, pointer1, sizeof(temp) );
printf("\nPacket before copy is 0x%x\n", packet[8]);

    unsigned char *array2 = malloc ( sizeof (x) + 1)  ;
    array2 = (char *)function1();
printf("\nArray2 is 0x%x\n", array2[0]);
    memcpy (packet + sizeof(temp), array2, sizeof(x) );
printf("After copy, Packet contents are 0x%x\n", packet[9]);
  }
Это было полезно?

Решение

Ниже приведены ошибки, которые я наблюдал в вашем коде. Вы написали

  char temp [] = { a,s,d,f,g,h};
  char * pointer1, *array1;
  pointer1 = &temp;  
  memcpy (array1, pointer1, sizeof( temp) );

Теперь нет необходимости делать это pointer1 = &temp, Имя любого самого массива является указателем. Следовательно, вы можете просто сделать


  char temp [] = { a,s,d,f,g,h};
  char *pointer1;
  memcpy (pointer1, temp , sizeof( temp) );

Но ждать!

У Porter1 достаточно места для хранения содержимого Temp []? В вашем коде вы не назначали никакого места для указателя1, который, вероятно, сбивает вашу программу.

Правильный способ сделать это


  char temp [] = { 'a','s','d','f','g','h'};
  char *pointer1 = malloc( sizeof(char) * (sizeof( temp) + 1) );
  memset( pointer1, 0x00, sizeof( temp) + 1 );
  memcpy (pointer1, temp , sizeof( temp) );

Здесь, прежде чем копировать любое значение в указатель1, мы убедились, что у него достаточно места.

Нет необходимости отличить значение MALLOC () Retroun. В sizeof( temp) + 1 1 добавляется для нулевого персонажа. Затем мы сделали MEMSSET (), наполненную памятью, указанную на указатель 1 с NULL. Просто хорошая и полезная практика.

Затем вы

memcpy ( pointer1 + sizeof(temp), pointer3, sizeof ( the temp array)

Опять же, POINTER1 достаточно места для содержимого указателя3? У вас есть область памяти, указанная на pointer1 + sizeof(temp)? Это тоже потерпит вашу программу.
Теперь вы либо используете realloc() или назначить большее пространство для указателя1 с malloc() на более ранней стадии.

Почему sizeof ( the temp array) здесь? Не думаете, что он должен иметь количество байтов в указателе3?

Наконец в определении function1()

char *pointer2, *array2;
 // Now i need to have pointer2 point to contents of array2.
 pointer2 = &temp2;
 return pointer2 

Что значит array2 делать? Ничего! Затем его следует удалить.
Вернуть просто использовать

return temp2;

что значит pointer2 тоже бесполезно.

Надеюсь, поможет.

Другие советы

Это не совсем понятно именно то, что вы пытаетесь сделать, но я считать Это то, что вы после. Я прокомментировал его, чтобы показать, что он делает.

void function1(char *dest, size_t len);

int main() 
{
  /* Allocate an array 'temp' */
  char temp[] = { 'a', 's', 'd', 'f', 'g', 'h' };

  /* Allocate an array 'array1', the same size as 'temp' */
  char array1[sizeof temp];

  /* Copy the contents of 'temp' into 'array1' */
  memcpy(array1, temp, sizeof temp);

  /* Call a function to copy new contents into 'array1' */
  function1(array1, sizeof array1);

  return 0;
}

void function1(char *dest, size_t len)
{
  char temp2[] = { 1, 2, 3, 4, 5 };

  /* Determine how much to copy - the _minimum_ of 'len' and 'sizeof temp2' */
  if (len > sizeof temp2)
  {
      len = sizeof temp2;
  }

  /* Copy contents of 'temp2' into 'dest' */
  memcpy(dest, temp2, len);
}

Я не могу понимать ваш код. Проблема проста, но код не будет работать. Далее этот кусок кодаmemcpy ( pointer1 + sizeof(temp), pointer3, sizeof ( the temp array)

Я предполагаю, что вы хотите, чтобы последний массив содержать {A, B, C, D, E, 1,2,3,4,5}. Ну, я бы посоветовал вам проверить указатели и массивы от K & R, а затем повторите попытку этой проблемы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top