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

字符数组是不会自动添加'/0'的,所以你的数组后面不会是0,至于为什么后面一直是1,那是因为你声明的数组是静态数组,存在静态存储区,0x01应该是用来标注数组或者静态存储区的结尾的

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问