C 我们可以返回指向指针函数的非指针值吗
上面的代码中有两个bug。 1) strcpy正在将src作为参数传递,但它作为str不合法 是指针 我找不到另一个。你能帮我吗 不合法,因为C 我们可以返回指向指针函数的非指针值吗,c,C,上面的代码中有两个bug。 1) strcpy正在将src作为参数传递,但它作为str不合法 是指针 我找不到另一个。你能帮我吗 不合法,因为str是指针 我不确定这是什么意思,但向函数传递指针是完全正确的 至于函数中的“bug”,很难说是否有,因为您没有提供函数的预期行为。该函数是合法的C,尽管使用起来非常无用和危险(并且会触发来自常见编译器的警告): 不要将地址返回给局部变量,因为它们在返回后不再存在,所以不能访问它们 如果要将以null结尾的字符串传递到函数中,并且需要获得其大小的缓冲区;
str
是指针
我不确定这是什么意思,但向函数传递指针是完全正确的
至于函数中的“bug”,很难说是否有,因为您没有提供函数的预期行为。该函数是合法的C,尽管使用起来非常无用和危险(并且会触发来自常见编译器的警告):
src
指向的以null结尾的字节字符串,包括
空终止符,指向第一个元素为的字符数组
由dest指向。如果dest
数组为
不够大。[……](重要但与问题无关)
省略部分)
所以strcpy需要两个指针。那很好。这不是虫子
要找到bug,请注意(仔细想想,这是合乎逻辑的):dest
数组必须足够大。这里“足够大”是什么意思?由于函数将字符串从src
复制到dest
,这意味着dest
必须至少是src
+1中的字符串长度,才能使用空终止符。这意味着strlen(src)+1
sizeof(src)
与平台上字符指针的大小相同。指针的大小。不是你想要的
下一个错误是,函数返回自动存储对象的地址,即结果
数组。这意味着当函数退出时,数组将不再存在,因此函数返回指向不再有效的对象的指针。解决方法是使用malloc
分配数组。另一种方法是将xpx
的签名更改为类似于提供目标数组的strcpy
所以求和它们,你需要一些东西:
char *strcpy( char *restrict dest, const char *restrict src );
另一个bug(是的,技术上它不是bug,但在我看来语义上它是bug)是src
应该是const char*
类型
潜在问题和bug的另一个来源是输入行为不好,例如,
src
不是以null结尾的,但是这个函数应该承担多少责任是有争议的。您忽略了这两个bug。将src
作为第二个参数传递给strcpy
非常好。sizeof(src)有多少字节?我想这是你的功课,你需要做。或者找老师的助手帮忙。或者请一位导师。具体来说,请看,主要的错误是它返回一个局部变量的地址。第二个bug是sizeof(src)——它给出了平台上指针的大小,没有用。注意charresult[strlen(src)+1]代码>仅在C99及更高版本的标准上有效。
char *strcpy( char *restrict dest, const char *restrict src );
char* result = malloc(strlen(src) + 1);