Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我们可以返回指向指针函数的非指针值吗_C - Fatal编程技术网

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

C 我们可以返回指向指针函数的非指针值吗,c,C,上面的代码中有两个bug。 1) strcpy正在将src作为参数传递,但它作为str不合法 是指针 我找不到另一个。你能帮我吗 不合法,因为str是指针 我不确定这是什么意思,但向函数传递指针是完全正确的 至于函数中的“bug”,很难说是否有,因为您没有提供函数的预期行为。该函数是合法的C,尽管使用起来非常无用和危险(并且会触发来自常见编译器的警告): 不要将地址返回给局部变量,因为它们在返回后不再存在,所以不能访问它们 如果要将以null结尾的字符串传递到函数中,并且需要获得其大小的缓冲区;

上面的代码中有两个bug。 1) strcpy正在将src作为参数传递,但它作为str不合法 是指针

我找不到另一个。你能帮我吗

不合法,因为
str
是指针

我不确定这是什么意思,但向函数传递指针是完全正确的

至于函数中的“bug”,很难说是否有,因为您没有提供函数的预期行为。该函数是合法的C,尽管使用起来非常无用和危险(并且会触发来自常见编译器的警告):

  • 不要将地址返回给局部变量,因为它们在返回后不再存在,所以不能访问它们

  • 如果要将以null结尾的字符串传递到函数中,并且需要获得其大小的缓冲区;然后,您必须在运行时使用类似的方法找出其长度,然后使用(或在C99及更高版本上使用)在堆上分配内存

  • 查看文档:

    复制
    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);