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

C 尝试从一个内存位置复制到另一个内存位置时出现分段错误,c,pointers,segmentation-fault,C,Pointers,Segmentation Fault,我必须编写一个在c中重现strcpy行为的函数 如果我正确理解这个函数,它会将字符串从源内存位置复制到目标内存位置,并返回指向目标内存位置的指针 下面是我生成的代码: #include <stdio.h> char *ft_strcpy(char *dest, char *src) { char *mem = dest; while (*src != '\0') { *dest = *src; src++; dest++; } *dest

我必须编写一个在c中重现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++;
  }
}
但是我不明白这条线出了什么问题。对我来说,这行的意思是“将src指针指向的值复制到dest指向的内存位置”


有人能解释一下这个代码出了什么问题吗

你从来没有给过
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;

比如:


您从未给
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;

比如:

您的第一个问题是将
dest
发送到
ft\u strcpy
printf
,而不给它赋值。它的实际价值是不确定的,很可能是任何东西

dest
需要是一个指向足够容纳
word
的内存的指针

char *dest = malloc(strlen(word) + 1)
如果我们为空终止符分配
word
+1字节的长度,
ft\u strcpy
将正常工作

然后你只需要记住使用免费的

free(dest);
就这样

您唯一的问题是
ft\u strcpy
dest
不是有效指针时,通过取消引用
*dest
执行未定义的操作

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);
}
您的第一个问题是将
dest
发送到
ft\u strcpy
printf
,而不给它赋值。它的实际价值是不确定的,很可能是任何东西

dest
需要是一个指向足够容纳
word
的内存的指针

char *dest = malloc(strlen(word) + 1)
如果我们为空终止符分配
word
+1字节的长度,
ft\u strcpy
将正常工作

然后你只需要记住使用免费的

free(dest);
就这样

您唯一的问题是,
ft\u strcpy
dest
不是有效指针时,通过取消引用
*dest
执行未定义的操作。

1。您的*dest在main中挂起指针,所以首先需要使用malloc()或其他方法将一些有效地址存储到其中。
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);
}
2.在数组中存储代码段中字符串的地址是一种糟糕的编程实践。 3.检查修改后的代码。 #包括 #包括/*用于strcpy*/ #包括/*用于malloc*/ char*ft\u strcpy(char*dest,char*src) { char*mem=dest; 而(*src!='\0') { *dest=*src; src++; dest++; } *dest='\0'; 返回mem; } int main() { 字符单词[5];strcpy(单词,“单词”); printf(“%s\n”,word); printf(“字地址为%p\n”,字); char*dest=malloc(strlen(word)+1);//+1表示空终止字符。 printf(“目的地地址为%p”,目的地); char*temp=dest; ft_strcpy(dest,word); 而(*dest!='\0'){ printf(“%c”,*dest); dest++; } 免费(临时); }
1。您的*dest在main中挂起指针,所以首先需要使用malloc()或其他方法将一些有效地址存储到其中。
2.在数组中存储代码段中字符串的地址是一种糟糕的编程实践。
3.检查修改后的代码。
#包括
#包括/*用于strcpy*/
#包括/*用于malloc*/
char*ft\u strcpy(char*dest,char*src)
{  
char*mem=dest;
而(*src!='\0')
{  
*dest=*src;
src++;
dest++;
}
*dest='\0';
返回mem;
}
int main()
{
字符单词[5];strcpy(单词,“单词”);
printf(“%s\n”,word);
printf(“字地址为%p\n”,字);
char*dest=malloc(strlen(word)+1);//+1表示空终止字符。
printf(“目的地地址为%p”,目的地);
char*temp=dest;
ft_strcpy(dest,word);
而(*dest!='\0'){
printf(“%c”,*dest);
dest++;
}
免费(临时);
}

谢谢@john,但是char*dest不是应该声明一个指针并保留一个内存分配吗?@DavidGeismar No.
char*dest
只是给你一个指针,没有设置任何值。我实际上在char-dest[10]中遇到了一个错误,不能增加'char[10]类型的值。不要更改
ft\u strcpy
,只需更改“分配”如图所示。问题出现在
main
中,在这里,您将未初始化的值传递给复制函数。你需要解决这个问题。我已经试着按照你说的那样,使用char block[10]char*dest=block将mem分配给dest。但是最终它并没有像在主函数末尾的while循环中那样打印复制的字符链…谢谢@john,但是char*dest不是应该声明一个指针并保留一个内存分配吗?@DavidGeismar No.
char*dest
只是给你一个指针,没有设置任何东西。我实际上在char-dest[10]中遇到了一个错误,不能增加'char[10]类型的值,不要更改
ft\u strcpy
,只需更改“分配”,如图所示。问题出在
main
中,您将未初始化的值传递给y