| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7166 人关注过本帖
标题:被困扰了一个下午,求大神解答。VC6.0能编译通过,VS2013报错错误。
只看楼主 加入收藏
longshuai19
Rank: 1
来 自:武汉
等 级:新手上路
帖 子:7
专家分:0
注 册:2015-4-2
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:23 
被困扰了一个下午,求大神解答。VC6.0能编译通过,VS2013报错错误。
是一个与链表相关的代码,输入学生总人数及,每个学生的姓名成绩,并将输入的内容显示出来。。
VC6.0能编译通过,VS2013报错error C4703: 使用了可能未初始化的本地指针变量“p1”
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct student
{
 char name[15];
 int mark;
 struct student *next;
}Node,*node;
main()
{
int num,i;
node p,p1,head;
head=(node)malloc(sizeof(Node));                        /*分配内存地址*/
if(head==NULL)                                     /*判断地址分配是否成功*/
{
printf("error");
exit(1);
}
else
head->next=NULL;
printf("please input the number of students:\n");
scanf("%d",&num);
printf("please input information:");
for(i=0;i<num;i++)
{
p=(node)malloc(sizeof(Node));
if(p==NULL)
{
printf("error");
exit(1);
}
else
{
printf("\nname:");
scanf("%s",p->name);
printf("mark:");
scanf("%d",&p->mark);
if(head->next==NULL)
{
head->next=p;                                     /*头结点的next域指向p*/
p1=p;                                         /*p1指向p*/
}
else
{
p1->next=p;                                     /*将p链到链表中*/
p1=p;
}
}
}
p1->next=NULL;                                 /*将链表中最后一个结点的指针域置空*/
p=head->next;
printf("the list:\n");
while(p!=NULL)
{
printf("name:%s",p->name);
printf(" mark:%d\n",p->mark);
p=p->next;
}
}
搜索更多相关主题的帖子: include 姓名 
2015-04-02 21:09
longshuai19
Rank: 1
来 自:武汉
等 级:新手上路
帖 子:7
专家分:0
注 册:2015-4-2
收藏
得分:0 
if(head->next==NULL)
{
head->next=p;                                     /*头结点的next域指向p*/
p1=p;                                         /*p1指向p*/
}
else
{
p1->next=p;                                     /*将p链到链表中*/
p1=p;
}
报错的是是else里p1->next=p里的这个p1,说这个指针未初始化,这不可能,根据前面的代码,主函数前面有head->next=NULL,那这个循环第一次执行时符合if里的条件的,会对p1赋值,后面的循环才会执行else的部分,就是保证P1始终是单链表里最后一个节点的指针域。
在VC6.0里和TC2.0环境都运行成功,可是在VS2013一直错误,折磨了我一下午啊!!!!!
2015-04-02 21:16
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:4 
图片附件: 游客没有浏览图片的权限,请 登录注册

程序代码:
#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)
typedef struct student {
    char name[15];
    int mark;
    struct student *next;
} Node, *node;

int main(void) {
    int num, i;
    node p, p1, head;
    head = (node)malloc(sizeof(Node));

    if (head == NULL) {
        printf("error");
        exit(1);

    } else
        head->next = NULL;

    printf("please input the number of students:\n");
    scanf("%d", &num);
    printf("please input information:");

    for (i = 0; i < num; i++) {
        p = (node)malloc(sizeof(Node));

        if (p == NULL) {
            printf("error");
            exit(1);

        } else {
            printf("\nname:");
            scanf("%s", p->name);
            printf("mark:");
            scanf("%d", &p->mark);

            if (head->next == NULL) {
                head->next = p;
                p1 = p;

            } else {
                p1->next = p;
                p1 = p;
            }
        }
    }

    p1->next = NULL;
    p = head->next;
    printf("the list:\n");

    while (p != NULL) {
        printf("name:%s", p->name);
        printf(" mark:%d\n", p->mark);
        p = p->next;
    }
    return 0;
}

Only the Code Tells the Truth             K.I.S.S
2015-04-02 21:29
执笔画江山
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:265
专家分:1010
注 册:2015-1-13
收藏
得分:0 
VS2013?这么高级!!!

授人以鱼,不如授人以渔
2015-04-02 23:12
longshuai19
Rank: 1
来 自:武汉
等 级:新手上路
帖 子:7
专家分:0
注 册:2015-4-2
收藏
得分:0 
回复 3楼 longwu9t
哥们,非常谢谢你的回答。
其实我问的是为什么这个VS2013会在那报错,比如VS2013里scanf函数无法使用,我百度可以知道原因,这里他提示有未初始化的指针,我也想知道原因,我百度不到所以来提问。
按照你的提示,我也在代码前加了#pragma warning(disable:)这个函数,再输入他报错的编号,结果就能运行了!百度了一下,这个是将某个警告置为失效的。
可是我还是好想知道报错的原因啊!   再次感谢你!
2015-04-03 08:35
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
回复 5楼 longshuai19
如果你坚持用vs
就要按微软的标准来
c源文件后缀名用cpp
不用scanf等微软认为不安全的函数

反之你要是觉着自己可以掌控又不想放弃使用vs的话
就加那个预编译命令

最后 假若是仅仅来学c
是没有必要用vs的
装个vs2013 各种补丁打完 要占用20G左右的磁盘空间
太臃肿太迟缓了

有很多轻量级的C编译器或者IDE
vs这个IDE与vc++编译器只是其中的一个选择而已

Only the Code Tells the Truth             K.I.S.S
2015-04-03 09:14
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:1 
你声明p1的时候没有初始化,而后面的代码,有多个if分支,並非所有分支都对p1进行了赋值,这个报错就是告诉你:在某个分支上缺了对p1的赋值!这是绝对的逻辑危险,千万不要靠关闭警告来消灭警告。vc6检查不出来的隐藏逻辑风险,更高版本的vc有这个能力,就如xp的漏洞被win7修补过一样,你不会说因为win7太新而用xp才是正宗吧?

授人以渔,不授人以鱼。
2015-04-03 09:36
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
顶T版,就这句,并非所有分支都对p1进行了赋值

[ 本帖最后由 embed_xuel 于 2015-4-3 10:14 编辑 ]

总有那身价贱的人给作业贴回复完整的代码
2015-04-03 09:39
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:5 
首先更正一下,楼主那应该是警告,而不是错误。

楼主的问题在下面这部分代码的逻辑
程序代码:
            if(head->next==NULL)
            {
                head->next=p;                                     /*头结点的next域指向p*/
                p1=p;                                         /*p1指向p*/
            }
            else
            {
                p1->next=p;                                     /*将p链到链表中*/
                p1=p;
            }

也就是说,p1的初次赋值只出现在if块里(else块里没有)。虽然你的分析是对的,上面的代码保证if块会先被执行,但你的编译器还没那么智能,它认为存在p1未赋值先使用的可能。

如果只想消除这条警告你只需要给p1赋个初值就行,哪怕是NULL。

如果你想消除的是警告所提示的隐忧,那你应该改变程序逻辑。说实话,你的代码冗余逻辑太多。所有的else都没用,删与不删是一样的。动态申请的内存也没释放。

具体消除警告的改法是。在head赋值后加一句
p1 = head;
然后删掉我粘的那部分代码里的if部分,只保留else里那两句就行了。

你可以试试。

重剑无锋,大巧不工
2015-04-03 09:41
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
这么巧?楼上两位好!

重剑无锋,大巧不工
2015-04-03 09:43
快速回复:被困扰了一个下午,求大神解答。VC6.0能编译通过,VS2013报错错误。
数据加载中...
 
   



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

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