我们可以返回非指向指针函数的值

时间:2018-05-07 21:26:45

标签: c

 char* xpx(char* src) 
 {  
      char result[sizeof(src)];  

      strcpy(result,src);  

      return result;

 }

上面的代码中有2个错误。 1)strcpy将src作为参数传递,但它不合法为str 是一个指针。

我无法找到另一个。你能帮帮我吗?

2 个答案:

答案 0 :(得分:0)

  

不合法,因为str是指针

不确定你的意思,但是将指针传递给函数是完全没问题的。

至于"错误"在函数中,很难说是否有任何,只要你没有提供函数的预期行为。该函数是合法的C,虽然使用起来非常无用且危险(并且会触发常见编译器的警告):

  1. 不要将地址返回给本地变量,因为它们在您返回后不再存在,因此您不能访问它们。

  2. 如果要将以null结尾的字符串传递给函数,则需要获取其大小的缓冲区;然后你必须在运行时使用strlen()之类的东西找出它的长度,然后用malloc()(或在C99及更高版本上使用VLAs)在堆上分配内存。

答案 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}}不是以空值终止的,那么这个函数对此应该承担多少责任是值得商榷的。