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(1, 10);
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
abc11abc22
baoshaohua:gdb bao$
将接口里面的字符串“放到”malloc的内存中。
解决方法2(申请全局的指针)
1//char str[10] = {0}; 这样也是可以的,函数里面就不用malloc
2char *str;
3
4char *test()
5{
6
7 str = calloc(1, 10);
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