之前在这里问过这个问题,但可能是表述不清,收效甚微,今天再次提出这个问题,希望各位知情者能帮我解答一下,谢谢!
下面将简化后的代码贴出来:
#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数组首地址之前看到的,数组元素正常
这是在return后,从返回的首地址读取数组得到的,可以看到数组末尾多出了一个0x01的元素
打开数组首地址对应的内存地址,可以清楚看到
如果编译器将字符数组作为字符串的一种形式进行处理,在得到字符串的首地址之后,会向后一直搜索,直到搜索到'\0'为止,也可以理解,因为0x01后面就是'\0',但是为什么每次运行程序,后面都会多出一个0x01,而不是其他的什么字符,出现一次是巧合,但每次出现算是问题了吧。
希望有知道其中原因的能帮我解答一下,两个问题:
1.为什么后面会多一个元素?
2.为什么这个元素是0x01?
谢谢!