vlambda博客
学习文章列表

C语言常见问题--return返回字符串

C语言常见问题--return返回字符串

问题来源:

C语言函数 返回(字符串)数据。

一、问题来源 demo:

 1#include <stdio.h>
2#include <string.h>
3#include <stdlib.h>
4
5char * test()
6
{
7    char str[10] = {0};
8
9    strcpy(str, "abc");
10    printf("%s11\n\n", str);
11    return str;
12}
13
14int main() {
15
16    char str1[10] = {0};
17
18    strcpy(str1, test());
19
20    printf("%s22\n\n", str1);
21    return 0;
22}

运行结果:

1baoshaohua:gdb bao$ gcc -o test test2.c 
2test2.c:33:12: warning: address of stack memory associated with local variable 'str' returned
3      [-Wreturn-stack-address]
4    return str;
5           ^~~
61 warning generated.

解析:

1、test函数里面的 str的作用域只在本函数内。

解决方法1(malloc申请内存)

 1#include <stdio.h>
2#include <string.h>
3#include <stdlib.h>
4
5char * test()
6
{
7    char *str = calloc(110);
8
9    strcpy(str, "abc");
10    printf("%s11\n\n", str);
11    return str;
12}
13
14int main() {
15
16    char str1[10] = {0};
17
18    strcpy(str1, test());
19
20    printf("%s22\n\n", str1);
21    return 0;
22}

运行结果:

baoshaohua:gdb bao ./test
abc11

abc22

baoshaohua:gdb bao$

将接口里面的字符串“放到”malloc的内存中。


解决方法2(申请全局的指针)

 1//char str[10] = {0};  这样也是可以的,函数里面就不用malloc
2char *str;
3
4char *test()
5
{
6
7    str = calloc(110);
8
9    strcpy(str, "abc");
10    printf("%s11\n\n", str);
11    return str;
12}
13
14int main() {
15
16    char str1[10] = {0};
17
18    strcpy(str1, test());
19
20    printf("%s22\n\n", str1);
21    return 0;
22}

指针类似的变量str是全局的。不会有作用域小的问题。

指针、指针数组

1char * str = NULL;
2char str[10] = {0};

三、 return返回 int

 1int test()
2{
3    int num = 5;
4    return num;
5}
6
7int main() {
8    int num = 0;
9    num = test();
10}

这样的话,其实就相当于test()返回一个int的值,这个值保存到一个临时的变量里面。
然后这个临时变量再赋值给num。
因为int变量是可以直接赋值的,所以不会出错。

但是如果是字符串的话,字符串是不可以直接赋值的。。。。所以,(也可以这么理解)


     传送门:


作者的github:

https://github.com/Miss1xiaobao/Mygit


CSDN个人主页:

https://blog.csdn.net/weixin_44966900