WangYun_me 2017-05-10 09:12 采纳率: 25%
浏览 2549

C语言中字符数组作为函数返回值出现的问题

之前在这里问过这个问题,但可能是表述不清,收效甚微,今天再次提出这个问题,希望各位知情者能帮我解答一下,谢谢!

下面将简化后的代码贴出来:

#include <stdio.h>

#define N 4

char *char_array(int n);
int print_array(char *p, int n);

int main(void)
{
    char *p = NULL;
    p = char_array(N);
    print_array(p, N);
    return 0;
}

char *char_array(int n)
{
    static char test[N] = {0};
    int i = 0;
    for(i = 0; i < n; i++)
        test[i] = 'A';
    return test;
}

int print_array(char *p, int n)
{
    int i = 0;
    for(i = 0; i < n; i++)
        putchar(*(p+i));
    putchar('\n');
    return 0;
}

在子函数中字符数组做静态声明,是为了返回的数组首地址所指的那片内存不会因为子函数的调用完成而被释放掉。

下面贴出单步调试的过程:
设置断点,单步调试

断点调试

这是在return数组首地址之前看到的,数组元素正常

before return

这是在return后,从返回的首地址读取数组得到的,可以看到数组末尾多出了一个0x01的元素

after return

打开数组首地址对应的内存地址,可以清楚看到

memory

如果编译器将字符数组作为字符串的一种形式进行处理,在得到字符串的首地址之后,会向后一直搜索,直到搜索到'\0'为止,也可以理解,因为0x01后面就是'\0',但是为什么每次运行程序,后面都会多出一个0x01,而不是其他的什么字符,出现一次是巧合,但每次出现算是问题了吧。

希望有知道其中原因的能帮我解答一下,两个问题:

1.为什么后面会多一个元素?

2.为什么这个元素是0x01?

谢谢!

  • 写回答

2条回答 默认 最新

  • 关注

    Qter...这个确实多一个字节,原因肯定是你使用了static变量,这个是编译器做的事吧,屁股加0x01来表示这个是静态数据的结束,至于说为什么是0x01可以问问搞编译器开发的。个人也不太懂,望采纳

    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器