尝试从一个内存位置复制到另一个内存时出现分段错误

时间:2018-08-28 03:36:19

标签: c pointers segmentation-fault

我必须编写一个函数来重现c https://www.tutorialspoint.com/c_standard_library/c_function_strcpy.htm中strcpy的行为

如果我正确理解此功能,它将把字符串从源存储位置复制到目标存储位置,然后将指针返回到目标存储位置。

这是我生成的代码:

#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数组,其中包含“ word”和一个指针* dest。

但是,当我运行代码时,出现了59873分段错误。我认为是该行导致错误:

*dest = *src;

但是我不明白这行有什么问题。对我而言,此行的意思是“将src指针指向的值复制到dest指向的内存位置中。”

有人可以解释一下这段代码出了什么问题吗

3 个答案:

答案 0 :(得分:4)

您永远不会给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);
  ...

答案 1 :(得分:1)

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

您的第一个问题是要向destft_strcpy发送printf而不为其分配任何值。它具有的实际值不确定,很可能是任何值。

dest必须是指向足以容纳word的内存的指针。

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

如果我们将word的长度+ 1个字节分配给空终止符,则ft_strcpy将正常工作。

那么您只需要记住使用免费

free(dest);

就是这样。

您唯一的问题是,ft_strcpy不是有效指针时,*dest的行为是通过取消引用dest来定义的。

答案 2 :(得分:0)

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);
}