указатели на буквы c - PullRequest
       0

указатели на буквы c

2 голосов
/ 16 ноября 2011

Я новичок в программировании на C и не могу понять, почему это происходит.

char *example(char *temp) {
      char *xyz;
      memset(xyz,0,strlen(temp));
      strncpy(xyz,temp,3);
      strcat(xyz,"XX);
      return xyz;
      }

int main() {
      char temp[] = "ABCDEF"
      char *xyz;
      xyz = example(temp);
      printf("Returned string is: %s",xyz);
      return 0;
      }

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

Ответы [ 2 ]

6 голосов
/ 16 ноября 2011

Проблема здесь:

char *xyz;
memset(xyz,0,strlen(temp));

Вы никогда не инициализировали xyz.Следовательно, это недопустимый указатель.

Что нужно для этого сделать, выделить для него что-то:

char *xyz = malloc(strlen(temp) + 1);   //  Allocate, +1 is for the '\0'.
memset(xyz,0,strlen(temp));

и освободить его, когда закончите:

int main() {
    char temp[] = "ABCDEF"
    char *xyz;
    xyz = example(temp);
    printf("Returned string is: %s",xyz);

    free(xyz);   //  Free

    return 0;
}

РЕДАКТИРОВАТЬ: Другие проблемы:

Эти 3 строки здесь очень опасны:

  memset(xyz,0,strlen(temp));
  strncpy(xyz,temp,3);   //  The nul is not copied in strncpy.
  xyz[3] = '\0';         //  Add the nul manually.
  strcat(xyz,"XX");      //  You need to ensure that xyz is large enough.
0 голосов
/ 16 ноября 2011

xyz неинициализирован в вашем коде, и вы просто копируете строку 'temp' в случайное место в памяти в 'example'. Сначала вам нужно выделить его, то есть xyz = malloc (strlen (temp) + 1);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...