quark 发表于 2021-4-27 16:20:41

子函数内部字符串外部返回,怎样编程?

#include <stdio.h>
#include <conio.h>

char ch showch2(void)
{
   char chm = "   ";   
   chm = 'H', chm = 'T', chm = 'Y';
   return chm;   //return {'Y', 'T', 'H', '\0'};
}

int main(void)
{   
   printf("%s\n", showch2());
   return 0;
}
该代码无法编译,求各位大神指点,如何修改;这里拜谢啦。。。

yuxijian2020 发表于 2021-4-27 16:43:07

char* showch2(void)
{
   char chm = "   ";   
   chm = 'H', chm = 'T', chm = 'Y';
   return chm;   //return {'Y', 'T', 'H', '\0'};
}

wp231957 发表于 2021-4-27 16:47:51

yuxijian2020 发表于 2021-4-27 16:43


这是搞笑的吗?有经过实测??

yuxijian2020 发表于 2021-4-27 16:49:09

wp231957 发表于 2021-4-27 16:47
这是搞笑的吗?有经过实测??

emmm   我没看内部实现,就看到返回值就给他改了

wp231957 发表于 2021-4-27 16:51:12

yuxijian2020 发表于 2021-4-27 16:49
emmm   我没看内部实现,就看到返回值就给他改了

函数内部地址是无法传到外部的

yuxijian2020 发表于 2021-4-27 16:52:44

本帖最后由 yuxijian2020 于 2021-4-27 16:54 编辑

稍微改一下,emmmm
char* ReturnString()
{
    int size = 4;
    char* a = (char*)malloc(size * sizeof(char));
    if (!a)
      return NULL;

    a = '1';
    a = '2';
    a = '3';
    a = '\0';

    return a;
}

int main()
{
    char* result = ReturnString();
    printf_s("%s", result);

    free(result);
    return 0;
}

yuxijian2020 发表于 2021-4-27 16:53:57

wp231957 发表于 2021-4-27 16:51
函数内部地址是无法传到外部的

申请个空间就OK了,稍微改一下吧...{:10_269:}

wp231957 发表于 2021-4-27 16:57:23

yuxijian2020 发表于 2021-4-27 16:53
申请个空间就OK了,稍微改一下吧...

可有实测,贴个图
理论上,这个空间也是传不出来的

yuxijian2020 发表于 2021-4-27 16:59:30

wp231957 发表于 2021-4-27 16:57
可有实测,贴个图
理论上,这个空间也是传不出来的

yuxijian2020 发表于 2021-4-27 17:01:11

wp231957 发表于 2021-4-27 16:57
可有实测,贴个图
理论上,这个空间也是传不出来的

lingehhhc666 发表于 2021-4-27 17:03:18

用全局变量,不返回

yuxijian2020 发表于 2021-4-27 17:05:28

wp231957 发表于 2021-4-27 16:57
可有实测,贴个图
理论上,这个空间也是传不出来的

a 只是保存了 4个字节空间 的首地址
这个地址被申请出来后,没有被释放
它只要告诉外面的指针这个首地址在哪外面就可以访问这个地址了

人造人 发表于 2021-4-27 17:20:01

yuxijian2020 发表于 2021-4-27 16:43


这个程序是错误的,你不应该返回局部变量的地址
要加一个 static 才正确

char* showch2(void)
{
    static char chm = "   ";
   chm = 'H', chm = 'T', chm = 'Y';
   return chm;   //return {'Y', 'T', 'H', '\0'};
}

yuxijian2020 发表于 2021-4-27 17:26:21

人造人 发表于 2021-4-27 17:20
这个程序是错误的,你不应该返回局部变量的地址
要加一个 static 才正确

咋我都说明白了啊
a 是个临时变量,但是它指向了一个已经申请过空间的地址
指向的空间没有释放,a 是个变量但是空间一直存在
此时就像 返回普通变量一样
a 把自己指向的空间的首地址传到外面,外面的变量就可以访问这块空间了
只是要注意释放空间

liaoziying1998 发表于 2021-4-27 18:17:43

const int size = 4;

char(*ReturnPointerToArray(void)){
        char chm = "YTH";
        return &chm;
}
参考C++Primer

人造人 发表于 2021-4-27 18:35:07

liaoziying1998 发表于 2021-4-27 18:17
参考C++Primer

$ cat main.cpp
#include <iostream>

const int size = 4;

char(*ReturnPointerToArray(void)){
    char chm = "YTH";
    return &chm;
}

int main() {
    std::cout << *ReturnPointerToArray() << std::endl;
    return 0;
}
$ g++ -g -Wall -o main main.cpp
main.cpp: In function ‘char (* ReturnPointerToArray())’:
main.cpp:7:12: warning: address of local variable ‘chm’ returned [-Wreturn-local-addr]
    7 |   return &chm;
      |            ^~~~
main.cpp:6:10: note: declared here
    6 |   char chm = "YTH";
      |          ^~~
$ ./main
$ vim main.cpp
$ cat main.cpp
#include <iostream>

const int size = 4;

char(*ReturnPointerToArray(void)){
    static char chm = "YTH";
    return &chm;
}

int main() {
    std::cout << *ReturnPointerToArray() << std::endl;
    return 0;
}
$ g++ -g -Wall -o main main.cpp
$ ./main
YTH
$

liaoziying1998 发表于 2021-4-27 18:47:50

#include<iostream>
using std::cout;

const int size = 4;

char(*ReturnPointerToArray()){
        static char chm = "YTH";
        return &chm;
}

int main()
{
        char(*chm) = ReturnPointerToArray();
        cout << *chm;
        return 0;
}
ReturnPointerToArray()返回的是一个指针,指向一个含有4个元素的char数组
注:1、最好定义常量size,使三个位置的数值一致
2、定义成static变量才能保存"YTH",否则ReturnPointerToArray()执行完后内存释放,cout输出的是乱码

liaoziying1998 发表于 2021-4-27 18:59:24

#include<iostream>
using std::cout;
#include<string>
using std::string;

string ReturnString() {
        string s = "YTH";
        return s;
}

int main() {
        cout << ReturnString;
        return 0;
}
我能想到的极致了

liaoziying1998 发表于 2021-4-27 19:02:43

liaoziying1998 发表于 2021-4-27 18:59
我能想到的极致了

#include<iostream>
using std::cout;
#include<string>
using std::string;

string ReturnString() {
        string s = "YTH";
        return s;
}

int main() {
        string s = ReturnString();
        cout << s;
        return 0;
}

quark 发表于 2021-4-27 23:01:02

多谢各位大神、老大,指点、指教;very good。。。Tank you much。。。
页: [1]
查看完整版本: 子函数内部字符串外部返回,怎样编程?