我必须编写一个函数来重现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指向的内存位置中。”
有人可以解释一下这段代码出了什么问题吗
答案 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);
您的第一个问题是要向dest
和ft_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);
}