调用完后内存释放,这些地址就可能放入其他的变量,数组相邻元素的地址就不连续了
那么如果此时又有函数对刚释放的内存进行写入(程序本身··或电脑的其它软件?)那么还能显示正确的月份吗?
我错了,第一个程序的输出的第一行就有可能输出不正确的结果,因为他占用用的内存可能会被其他变量占用,第一行的输出就是未定义行为
程序代码:
for(i=0;i<N;i++)
{
printf("请输入第%d位学生姓名:",i+1);
scanf("%s",score[i].name);
printf("%s请输入该生的语文 数学 英语成绩:",score[i].name);
fflush(stdin);
scanf("%f%f%f",&score[i].chinese,&score[i].math,&score[i].english);
score[i].total=score[i].chinese+score[i].math+score[i].english;
}
改为
程序代码:
int j;
for(i=0;i<N;i++)
{
for(j=0;j<10;j++)
score[i].name[j] = 'a';
printf("%s请输入该生的语文 数学 英语成绩:",score[i].name);
fflush(stdin);
scanf("%f%f%f",&score[i].chinese,&score[i].math,&score[i].english);
score[i].total=score[i].chinese+score[i].math+score[i].english;
}
我运行之后,第一行的名字不是aaaaaaaaaa,而是乱码,应该是name数组所占用的内存被其他变量占用了,大概可以证明第一行是未定义行为了,但未定义行为表现了正常的结果(分数)...
显示月份的那个程序,我认为会输出正常的结果,因为m_month()函数返回的是字符串的地址,字符串在内存中是静态存储的,所占用的内存不会被其他变量占用
这是我看了别人的讨论得出的,个人理解,不知道对不对
(10:44:51 PM) TheNovice: when i write char *ptr = "HELLO" where is storage for hello allocated
(10:45:45 PM) ramok: TheNovice: in static data segment
(10:46:06 PM) TheNovice: so if i return ptr from a function
(10:46:29 PM) TheNovice: will this "HELLO" be retained in memory and legally used in other functions
(10:47:19 PM) Zhivago: The: The question is not about the pointer -- it is about what it points into.
(10:47:48 PM) Zhivago: The: "HELLO" is a string literal. String literals have static storage, so they do not get deallocated.
(10:48:00 PM) Zhivago: The: This means that you may safely point into them at all times.
[
本帖最后由 sidooh 于 2009-12-18 13:10 编辑 ]