Как разыменовать пустой указатель как строку - PullRequest
0 голосов
/ 24 марта 2020

Я сейчас пытаюсь скопировать строку в указатель void. Вот структура указателя void, которую я использую.

typedef struct
  {
  struct runtime_type *runtimeTypeHead; /* Array of Runtime Types       */
  ST_INT numRuntimeTypes;               /* # of Runtime Types in array  */
  ST_CHAR *dataBuf;                     /* ptr to local data            */
  ST_VOID *userInfo;                    /* To store anything user wants.*/
                                        /* GSE code does not use it.    */
  } GSE_IEC_DATA_ENTRY;

И я использую userInfo, как вы можете видеть.

Я неправильно использовал память и использовал memcpy в качестве вашего можно увидеть в коде ниже.

DataEntry->userInfo = safe_malloc(sizeof(ST_CHAR)*strlen(ps8tmp+1));
memcpy((ST_CHAR*)DataEntry->userInfo, ps8tmp,strlen(ps8tmp));

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

printf("Updated DataEntry : %s\n", *(ST_CHAR*) DataEntry->userInfo);

Кто-нибудь может указать, почему у меня возникает ошибка сегмента, когда я просто печатаю строку?

1 Ответ

0 голосов
/ 24 марта 2020

Это:

DataEntry->userInfo = safe_malloc(sizeof(ST_CHAR)*strlen(ps8tmp+1));

имеет две проблемы:

  1. Не используйте sizeof(char) при выделении места для строк; оно всегда равно 1, если вы не используете exoti c с явными 16-битными символами или чем-то подобным.
  2. Если использование strlen() кажется неправильным, вы добавляете в в скобках, он будет вызывать strlen() в строке минус первый символ. Если строка была пустой, это даст неопределенное поведение. Вы имели в виду strlen(ps8tmp) + 1.
...