Арифметика указателей с массивами - PullRequest
1 голос
/ 08 марта 2012

Я новичок в программировании на C, и меня смущает математика указателя.У меня есть массив символов размером 32. Насколько я понимаю, это означает, что массив также составляет 32 байта, поскольку символьная переменная имеет размер 1 байт, следовательно, 32 characters * 1 byte = 32 bytes.Проблема заключается в том, что при наличии функции, имеющей пустой указатель, который указывает на массив символов, как описано ранее.Я считаю, что сегмент кода

for (count = 0; count < size; count++)
*((int*) raw_sk + count) = 0

должен установить все слоты в буфере raw_sk, должен быть установлен в 0. Однако, когда я запускаю программу, я получаю ошибку сегментации.Я подумал, что это может быть тот факт, что я добавляю счет к адресу.Я думал, что если бы я добавил один к адресу, я бы перешел к следующему слоту в массиве.Может кто-нибудь указать, где я иду не так?Функция, которую я использую, ниже.Спасибо!

void
write_skfile (const char *skfname, void *raw_sk, size_t raw_sklen)
{
  int fdsk = 0;
  char *s = NULL;
  int status = 0;
  int count = 0;
  int size = (raw_sklen);


  /* armor the raw symmetric key in raw_sk using armor64 */
  s = armor64(raw_sk, raw_sklen);

  /* now let's write the armored symmetric key to skfname */

  if ((fdsk = open (skfname, O_WRONLY|O_TRUNC|O_CREAT, 0600)) == -1) {
    perror (getprogname ());

    /*scrubs the armored buffer*/
    for(count = 0; count < armor64len(s); count++)
    s[count] = '0';

    free (s);

    /* scrub the buffer that's holding the key before exiting */
   for (count = 0; count < size; count++)
    *((int*)raw_sk + count) = 0;

    exit (-1);
  }
  else {
    status = write (fdsk, s, strlen (s));
    if (status != -1) {
      status = write (fdsk, "\n", 1);
    }

   for (count = 0; (size_t)count < 22; count++)
    *((int*)raw_sk + count) = 0;

   free (s);
    close (fdsk);

    /* do not scrub the key buffer under normal circumstances
       (it's up to the caller) */ 

    if (status == -1) {
      printf ("%s: trouble writing symmetric key to file %s\n", 
          getprogname (), skfname);
      perror (getprogname ());

    /* scrub the buffer that's holding the key before exiting */

       /* scrub the buffer that's holding the key before exiting MY CODE
    for (count = 0; count < size; count++)
    *((int*)raw_sk + count) = 0;*/

      exit (-1);
    }
  }
}

Ответы [ 3 ]

3 голосов
/ 08 марта 2012

Вы увеличиваете указатель на размер int. Это не правильно. Если вы хотите обнулить массив, вы увеличиваете его на размер char. Еще лучше, просто используйте memset.

0 голосов
/ 08 марта 2012

Я думаю, что вы намеревались сделать

*((char*) raw_sk + count) = 0

, так как я предполагаю, что raw_sk указывает на массив символов

арифметика указателя работает путем перемещения адреса памяти на размер типа, поэтому в этом случаехочу чар

0 голосов
/ 08 марта 2012

Ваш цикл повторяет в общей сложности size*sizeof(int) байт (где, скорее всего, sizeof(int)==4), но массив имеет размер только size байт. Следовательно, ошибка сегментации.

...