Ошибка сегментации при попытке копирования из одной области памяти в другую - PullRequest
0 голосов
/ 28 августа 2018

Мне нужно написать функцию, которая воспроизводит поведение strcpy в c https://www.tutorialspoint.com/c_standard_library/c_function_strcpy.htm

Если я правильно понимаю эту функцию, она копирует строку символов из ячейки памяти источника в ячейку памяти назначения и возвращает указатель на ячейку памяти назначения.

Вот код, который я произвел:

#include <stdio.h>

char *ft_strcpy(char *dest, char *src)
{
  char *mem = dest;
  while (*src != '\0')
  {
    *dest = *src;
    src++;
    dest++;
  }
  *dest = '\0';
  return mem;
}

int main()
{
  char word[5] = "word";
  printf("%s \n", word);
  printf("word address is %p \n", word);
  char *dest;
  printf("dest address is %p", dest);
  ft_strcpy(dest, word);
  while (*dest != '\0'){
    printf("%c", *dest);
    dest++;
  }
}

Чтобы проверить мой код, я объявил массив слов word, содержащий слово и указатель * dest.

Однако, когда я запускаю свой код, я получаю ошибку сегментации 59873. Я понял, что именно эта строка отвечает за ошибку:

*dest = *src;

Однако я не понимаю, что не так с этой строкой. Для меня эта строка означает «скопировать значение, на которое указывает указатель src, в область памяти, на которую указывает dest».

Может кто-нибудь объяснить, что не так с этим кодом

Ответы [ 3 ]

0 голосов
/ 28 августа 2018
char *dest;
printf("dest address is %p", dest);
ft_strcpy(dest, word);

Ваша первая проблема заключается в том, что вы отправляете dest в ft_strcpy и printf без присвоения ему какого-либо значения. Фактическое значение, которое оно имеет, является неопределенным и вполне может быть чем угодно.

dest должен быть указателем на память, достаточно большую, чтобы вместить word.

char *dest = malloc(strlen(word) + 1)

Если для нулевого терминатора мы выделим длину word + 1 байт, ft_strcpy будет работать правильно.

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

free(dest);

Вот и все.

Ваша единственная проблема состояла в том, что ft_strcpy действовал неопределенно, разыменовывая *dest, когда dest не был действительным указателем.

0 голосов
/ 28 августа 2018
1 . Your *dest is dangling pointer in main so first you need to store some valid address into it by using malloc() or other method .
2 . Storing address of string from code section in array is bad programming practice .
3 . Check the modified code .

#include <stdio.h>
#include <string.h>  /* for strcpy */
#include <stdlib.h> /* for malloc */ 
char *ft_strcpy(char *dest, char *src)  
{  
  char *mem = dest;  
  while (*src != '\0')  
  {  
    *dest = *src;  
    src++;
    dest++;
  }
  *dest = '\0';
  return mem;
}

int main()
{
  char word[5]; strcpy(word,"word");
  printf("%s \n", word);
  printf("word address is %p \n", word);
  char *dest=malloc(strlen(word)+1); //+1 for null terminating character .
  printf("dest address is %p", dest);
  char *temp=dest;
  ft_strcpy(dest, word);
  while (*dest != '\0'){
    printf("%c", *dest);
    dest++;
  }
free(temp);
}
0 голосов
/ 28 августа 2018

Вы никогда не дадите dest значение, поэтому оно не определено. Поэтому ваша программа имеет неопределенное поведение. Более конкретно: char* dest; просто дает вам «указатель на символ», но фактически не устанавливает значение.

char c = 'A';
char *dest = &c;

Это 100% действительный код (но не для использования dest). Вам нужно указать dest на достаточно большой кусок памяти для ваших целей. Вы можете использовать динамическое выделение памяти:

dest = malloc(32); // 32 is a randomly selected value
// don't forget a NULL check and to free() once done.

Но если вы хотите пока избежать этой червей, тогда использование статического буфера будет работать.

char block[10]; // 10 is randomly selected to work in your example
char *dest = block;

или

char dest[10] = { 0 }; // initializes all to 0
// but now you can't do "dest++" etc.

Как:

int main()
{
  char word[5] = "word";
  char block[10]; // 10 is randomly selected to work in your example
  char *dest = block;

  printf("%s \n", word);
  printf("word address is %p \n", word);

  printf("dest address is %p", dest)
  ft_strcpy(dest, word);
  ...
...