char* xpx(char* src)
{
char result[sizeof(src)];
strcpy(result,src);
return result;
}
上面的代码中有2个错误。 1)strcpy将src作为参数传递,但它不合法为str 是一个指针。
我无法找到另一个。你能帮帮我吗?
答案 0 :(得分:0)
不合法,因为
str
是指针
不确定你的意思,但是将指针传递给函数是完全没问题的。
至于"错误"在函数中,很难说是否有任何,只要你没有提供函数的预期行为。该函数是合法的C,虽然使用起来非常无用且危险(并且会触发常见编译器的警告):
答案 1 :(得分:0)
查看strcpy文档:
char *strcpy( char *restrict dest, const char *restrict src );
复制
src
指向的以null结尾的字节字符串,包括 null终止符,到第一个元素为的字符数组 dest指出。如果dest
数组是,则行为未定义 不够大。 [...](重要但与问题无关 省略部分)
所以strcpy
确实需要2个指针。没关系。这不是一个错误。
要找到bug注意(并考虑它,它是合乎逻辑的):dest
数组必须足够大。什么"足够大"这意味着什么好了,因为函数将字符串从src
复制,包括空终止符到dest
,这意味着dest
必须至少为src
+ 1中字符串的长度终止。这意味着strlen(src) + 1
。
sizeof(src)
与sizeof(int*)
相同,result
是平台上char指针的大小。指针的大小。不是你想要的。
下一个错误是函数返回自动存储对象的地址,即malloc
数组。这意味着当函数退出时,数组将不再存在,因此函数返回指向不再有效的对象的指针。对此的解决方案是使用xpx
来分配数组。另一种方法是将strcpy
的签名更改为与提供目标数组的char* result = malloc(strlen(src) + 1);
类似的内容。
所以总结它们你需要一些东西:
src
另一个错误(是的,从技术上来说,这不是一个错误,但在语义上它是我认为的一个错误)是const char*
应该是src
类型。
潜在问题和错误的另一个来源是输入不是很好,例如:如果{{1}}不是以空值终止的,那么这个函数对此应该承担多少责任是值得商榷的。