vs2012下运行此程序总是错误指向为“ rep stosb”这一行是咋回事?

tcitry 2013-06-25 10:11:37
代码
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define scanf scanf_s
struct student {
char name[20];
int age;
struct student *next;
};

struct student *creat(){
struct student *h,*p1,*p2;
static int n;
h=NULL;
p1=p2=(struct student *)malloc(sizeof(struct student));
scanf("%s%d",p1->name,p1->age);
while (p1->name!=0){
n++;
if (n==1)
h=p1;
else
p2->next=p1;
p2=p1;
p1=(struct student *)malloc(sizeof(struct student));
scanf("%s%d",p1->name,p1->age);
}
p2->next=NULL;
return h;
}
void main(){
struct student *creat();
struct student *head,*p;
head=creat();
p=head;
while(p){
printf("%s,%d",p->name,p->age);
p=p->next;
}
}


截图如下,一涉及到有字符数组的时候就有这种情况,不知是哪里出错了,求破。
...全文
427 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
百衲图 2014-06-02
  • 打赏
  • 举报
回复
引用 14 楼 xxb249 的回复:
都出vs2012了?
我会说2013都开始流行了吗
赵4老师 2013-06-27
  • 打赏
  • 举报
回复
引用 12 楼 tcitry 的回复:
[quote=引用 3 楼 zhao4zhong1 的回复:] 崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。 判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
小弟真没看懂您的回复。不过数组多声明一个元素肯定不起作用啊,数组已经是name[20]了。 卡在那里的提示说明了什么?那个rep stosb说明了什么,网上查到的都是汇编的知识,看不懂。[/quote]
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}
旗舰111 2013-06-27
  • 打赏
  • 举报
回复
引用 19 楼 tcitry 的回复:
不想真是vs2012的问题。。。
从你的图中看,编译和链接均没问题,是单步调试时到memset.asm出了问题。估计是输入或者输入函数有问题。scanf_s必须提供一个数字以表明最多读取多少位字符,不知道你的代码里写了没?
旗舰111 2013-06-26
  • 打赏
  • 举报
回复
1、对于n,确实是我看错了,8楼正解。 3、可以要,也可以不要。 LZ的循环输入数据的代码没有终止条件,无法退出: while (p1->name!=0) 这是因为p1->name为字符串的地址,只要从scanf获取到字符并赋予name,则p1->name不会为0,这样代码会一直进行循环,无法退出。 改了一下代码,调试成功,其中把#define scanf scanf_s删除,添加了循环输入的终止条件【随便设定的】,当输入# 1时,退出,并结合1楼的代码。修改代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
struct student {
    char name[20];
    int age;
    struct student *next;
};

struct student *creat(){
    struct student *h,*p1,*p2;
    static int n;
    h=NULL;
    p1=p2=(struct student *)malloc(sizeof(struct student));
    printf("输入# 1结束\n");
    scanf("%s %d",p1->name,&p1->age);
    while (p1->name[0]!='#'){
        n++;
        if (n==1)
            h=p1;
        else
            p2->next=p1;
        p2=p1;
        p1=(struct student *)malloc(sizeof(struct student));
        scanf("%s %d",p1->name,&p1->age);
    }
    p2->next=NULL;
    return h;
}
void main(){
    struct student *creat();
    struct student *head,*p;
    head=creat();
    p=head;
    while(p){
        printf("%s,%d\n",p->name,p->age);
        p=p->next;
    }
}
橡木疙瘩 2013-06-26
  • 打赏
  • 举报
回复
create中的n不用赋初值,因为它是静态变量,会在程序加载时设为0。 fflush也不需要,因为stdin和stdout是关联的,每次从stdin读时,stdout自动flush。 第18行: while (p1->name!=0) p1->name永远也不会等于0. 建议楼主把你导致出错的输入贴出来。
tcitry 2013-06-26
  • 打赏
  • 举报
回复
引用 5 楼 qijian111 的回复:
3个问题: 1、creat函数中n没有赋初值; 2、scanf中p1->age错误,应该为&p1->age。1楼已解决 3、建议在第一次输入之后的每次输入之前,刷新一下缓冲区,使用fflush(NULL)。
1和2改正后仍然是截图那样,你说的3我把那个语句放到每个scanf语句的后面,还是那样。。。
tcitry 2013-06-26
  • 打赏
  • 举报
回复
引用 4 楼 anshiny 的回复:
(代码)
你的程序我运行了下还是这个截图上的问题。。。
tcitry 2013-06-26
  • 打赏
  • 举报
回复
不想真是vs2012的问题。。。
旗舰111 2013-06-26
  • 打赏
  • 举报
回复
3个问题: 1、creat函数中n没有赋初值; 2、scanf中p1->age错误,应该为&p1->age。1楼已解决 3、建议在第一次输入之后的每次输入之前,刷新一下缓冲区,使用fflush(NULL)。
anshiny 2013-06-26
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
//#define scanf scanf_s
struct student {
    char name[20];
    int age;
    struct student *next;
};

struct student *creat();

void main(){    
    struct student *head,*p;
    head = creat();
    p = head;
    while(p){
        printf("%s,%d\n",p->name,p->age);
        p = p->next;
    }
	return;
}

struct student *creat(){
    struct student *h, *p1, *p2;
    static int n;
    h = NULL;
    p1 = p2 = (struct student *)malloc(sizeof(struct student));
    scanf("%s%d", p1->name, &p1->age);
    while(strcmp(p1->name, "q") != 0){
        n++;
        if(n == 1)
            h = p1;
        else 
            p2->next = p1;
        p2 = p1;
        p1 = (struct student *)malloc(sizeof(struct student));
        scanf("%s%d", p1->name, &p1->age);
    }
    p2->next=NULL;
    return h;
}
赵4老师 2013-06-26
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。 判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
橡木疙瘩 2013-06-26
  • 打赏
  • 举报
回复
vs2008也没问题,更高的vs我这没装。OS是xp
橡木疙瘩 2013-06-26
  • 打赏
  • 举报
回复
M$喜欢搞这种事,总是要示编程时使用他提供的函数代替标准函数,你调用个std::copy他就会给警告。 我在MinGW4.7.1中试过,没有问题。
旗舰111 2013-06-26
  • 打赏
  • 举报
回复
引用 15 楼 tcitry 的回复:
[quote=引用 13 楼 qijian111 的回复:] 我先是用CodeBlocks写的,然后用VS2010都通过了。不太明白为什么不能用scanf?你建的工程对不对?
用的win32应用控制台程序,然后添加新建项.c文件和现有项.cpp文件都试过。[/quote] 那就不知道了,我这好好的,你在别的机子上试试。
tcitry 2013-06-26
  • 打赏
  • 举报
回复
引用 13 楼 qijian111 的回复:
我先是用CodeBlocks写的,然后用VS2010都通过了。不太明白为什么不能用scanf?你建的工程对不对?
用的win32应用控制台程序,然后添加新建项.c文件和现有项.cpp文件都试过。
xxb249 2013-06-26
  • 打赏
  • 举报
回复
都出vs2012了?
旗舰111 2013-06-26
  • 打赏
  • 举报
回复
引用 10 楼 tcitry 的回复:
[quote=引用 8 楼 u010936098 的回复:]
引用了9楼的代码,放到vs2012里面调试,(如果我把scanf_s换成scanf的话会提示出错,所以只好用scanf_s),还是这样的问题。
引用 9 楼 qijian111 的回复:
还是这样,9楼兄弟使用的什么编译器调试的?我开始怀疑这个vs2012了。。 还是谢谢几位了:-) [/quote] 我先是用CodeBlocks写的,然后用VS2010都通过了。不太明白为什么不能用scanf?你建的工程对不对?
tcitry 2013-06-26
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。 判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
小弟真没看懂您的回复。不过数组多声明一个元素肯定不起作用啊,数组已经是name[20]了。 卡在那里的提示说明了什么?那个rep stosb说明了什么,网上查到的都是汇编的知识,看不懂。
tcitry 2013-06-26
  • 打赏
  • 举报
回复
如上图,输入完第一行回车,就崩溃了。
tcitry 2013-06-26
  • 打赏
  • 举报
回复
引用 8 楼 u010936098 的回复:

引用了9楼的代码,放到vs2012里面调试,(如果我把scanf_s换成scanf的话会提示出错,所以只好用scanf_s),还是这样的问题。
引用 9 楼 qijian111 的回复:

还是这样,9楼兄弟使用的什么编译器调试的?我开始怀疑这个vs2012了。。
还是谢谢几位了:-)
加载更多回复(2)

70,026

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧