| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 993 人关注过本帖
标题:关于指针的问题(问题应该出在指针吧)
只看楼主 加入收藏
sidooh
Rank: 4
等 级:业余侠客
帖 子:121
专家分:265
注 册:2009-6-26
收藏
得分:0 
for(j=0;j<10;j++)
[i]            score.name[j] = 'a';
[i]        printf("%s请输入该生的语文 数学 英语成绩:",score.name);

[i]   是这句在输出时%s为乱码吗?一个个赋值name最后得到的应该不是字符串;把它改为
for(j=0;j<10;j++)
[i]            score.name[j] = 'a';
[i]        score.name[9]='\0';
[i]        printf("%s请输入该生的语文 数学 英语成绩:",score.name);
   就可以输出了。

我又错了..没有掌握好字符串的定义:以NULL结尾的字符序列

通过下面的代码测试了一下
程序代码:
#include <stdio.h>
#define N 3

typedef struct
{
    char name[10];
    float chinese;
    float math;
    float english;
}student;

student *sum()
{
    student score[N];
    int i,j;
    for(i=0;i<N;i++)
    {
        for(j=0;j<10;j++){
            score[i].name[j] = 'a';
        }
        score[i].name[9]='\0';
        score[i].chinese=3;
        score[i].math=3;
        score[i].english=3;
        printf("name:%s ",score[i].name);
    }
    printf("\n");
    return (score);
}
int main(int argc,char **argv)
{
    int i;
    student *ptr;
    ptr=sum();
    for(i=0;i<N;i++)
    {
        printf("%s's chinese:%.2f math:%.2f english:%.2f\n",
            ptr->name,ptr->chinese,ptr->math,ptr->english);
        ptr++;
    }

    return 0;
}
第一行输出的姓名是乱码

但如果改为
程序代码:
#include <stdio.h>
#define N 3

typedef struct
{
    char *name;
    float chinese;
    float math;
    float english;
}student;

student *sum()
{
    student score[N];
    int i,j;
    for(i=0;i<N;i++)
    {
        //for(j=0;j<10;j++){
        //    score[i].name[j] = 'a';
        //}
        //score[i].name[9]='\0';
        score[i].name="aaaaa";
        score[i].chinese=3;
        score[i].math=3;
        score[i].english=3;
        printf("name:%s ",score[i].name);
    }
    printf("\n");
    return (score);
}
int main()
{
    int i;
    student *ptr;
    ptr=sum();
    for(i=0;i<N;i++)
    {
        printf("%s's chinese:%.2f math:%.2f english:%.2f\n",
            ptr->name,ptr->chinese,ptr->math,ptr->english);
        ptr++;
    }

    return 0;
}
第一行输出的名字就是正确的了


这句输入的字符串也是静态存储的?在函数student结束后,结构数组score所占内存被释放,所以不能通过数组score的名字访问依然存在的字符串name对吗?

1.字符串是静态存储,但存放这些字符的数组不是静态存储
2.是的,但name不是字符串,是一个char数组
2009-12-18 18:29
无诲今生
Rank: 8Rank: 8
来 自:桂林理工大学
等 级:蝙蝠侠
威 望:2
帖 子:373
专家分:726
注 册:2009-5-11
收藏
得分:0 
    ptr=&score[0];
    return (ptr);
只输出一个成绩是因为你返回的只是第一个成绩,score[1]和score[2]没有返回。

顺境逆境切莫止境,得意失意切莫在意。
2009-12-18 19:01
perfectc
Rank: 1
等 级:新手上路
帖 子:15
专家分:1
注 册:2009-12-16
收藏
得分:0 
2.是的,但name不是字符串,是一个char数组
     
char数组在函数sum()结束后也被释放所以第一行输出为乱码   (~..~)!!
       指针所指向的字符串为静态存储所以可以正确输出  是这样吗?

那么
  char name[]="aaaaa";由字符数组组成的字符串是不是静态存储的?
2009-12-18 20:32
perfectc
Rank: 1
等 级:新手上路
帖 子:15
专家分:1
注 册:2009-12-16
收藏
得分:0 
回复 12楼 无诲今生
   是返回了一个值
    但在后面设想用ptr++把其它值都得出(不过此时函数sum已结束,数组score的内存被释放,所以指针移动得不出其它结果)
2009-12-18 20:39
sidooh
Rank: 4
等 级:业余侠客
帖 子:121
专家分:265
注 册:2009-6-26
收藏
得分:0 
char数组在函数sum()结束后也被释放所以第一行输出为乱码   (~..~)!!
       指针所指向的字符串为静态存储所以可以正确输出  是这样吗?

我认为是的


char name[]="aaaaa";由字符数组组成的字符串是不是静态存储的?
字符串是静态存储的,字符数组不是静态存储的,"aaaaa"是静态存储的,name数组不是静态存储的
2009-12-19 14:48
perfectc
Rank: 1
等 级:新手上路
帖 子:15
专家分:1
注 册:2009-12-16
收藏
得分:0 
    哦··明白了
   感谢你的回答~
2009-12-20 08:47
快速回复:关于指针的问题(问题应该出在指针吧)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017826 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved