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可以问问搞编译器开发的。个人也不太懂,望采纳

    评论

报告相同问题?

悬赏问题

  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?