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



我必须编写一个函数,在 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 != '')
{
*dest = *src;
src++;
dest++;
}
*dest = '';
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 != ''){
printf("%c", *dest);
dest++;
}
}

为了测试我的代码,我声明了一个包含"word"和指针*dest的字符单词数组。

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

*dest = *src;

但是我不明白这条线有什么问题。对我来说,这一行的意思是"将 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;

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);
...
char *dest;
printf("dest address is %p", dest);
ft_strcpy(dest, word);

您的第一个问题是您将dest发送到ft_strcpyprintf而不为其分配任何值。它的实际价值是不确定的,很可能是任何东西。

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

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

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

那你只需要记住使用免费

free(dest);

就是这样。

您唯一的问题是ft_strcpydest不是有效的指针时,通过取消引用*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 != '')  
{  
*dest = *src;  
src++;
dest++;
}
*dest = '';
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 != ''){
printf("%c", *dest);
dest++;
}
free(temp);
}

相关内容

  • 没有找到相关文章

最新更新