我必须编写一个函数,在 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_strcpy
并printf
而不为其分配任何值。它的实际价值是不确定的,很可能是任何东西。
dest
需要是一个指向内存的指针,内存足够大,以容纳word
。
char *dest = malloc(strlen(word) + 1)
如果我们为空终止符分配word
+ 1 字节的长度,ft_strcpy
将正常工作。
那你只需要记住使用免费
free(dest);
就是这样。
您唯一的问题是ft_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 != ' ')
{
*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);
}