c语言一编译就停止运行
‘壹’ c程序编译没问题,运行时就会停止工作怎么回事
int
a,b;
scanf("%d%d",&a,&b);//参数必须是指针(地址)才可以。
scanf()函数要求参数必须是指针类型,即将地址传输到其内,才可以让a
,
b变量中获取到数据。
如果你学过指针,你就会理解了。
c语言中函数的调用中,参数传递,只能传递数值。如果只是将数值传递过去(接收者是形参),在子函数中变化,形参的变化,不会影响到实参数据的内容。
c中,每定义一个变量,系统都会在内存中给其分配一个空间用来存储数据。而这个空间的编号就是这个变量的地址。当我们将这个地址传递到子函数中,子函数在操作数据时,就会改变这个地址中的数据,这样,实参的数据是会发生变化。
而你程序中,传递的是a
b本身的值(可能是0,可能是1,可能是任意的数),scanf()将这两个值当作地址去操作,因此会产生系统错误,导致程序运行停止。
‘贰’ C语言编译的时候停止工作是为什么 代码如下
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedefintelem;
typedefstructlist
{
elemdata;
structlist*L;//按习惯对代码顺序作了调整
}sq;
voidcreatelist(intn,sq*s,inta[]){
inti;
sq*q,*p;//这里作了调整.
p=s;//加入一个指针p,在下面运行时,p将实时指向链表末尾结点
for(i=0;i<n;i++){//s应该是给链头,不要动它.
q=(sq*)malloc(sizeof(sq));//只是将新建的结点q不断加入链表
q->data=a[i];//这样,主程序得到的s才是真正的表头.
q->L=p->L;
p->L=q;//将新结点q插入链表末尾,可按需要调整为从表头插入数据
p=q;//指针p改变
}
}
intmain()
{
inti;
sq*s=(sq*)malloc(sizeof(sq));//先分配一个空数据的头结点
inta[]={1,2,3,4};
s->L=NULL;//头结点末尾为空
createlist(4,s,a);
s=s->L;//s是头节点,s->data此时为空,输出数据要从第2个结点开始
while(s!=NULL){
printf("%d",s->data);
s=s->L;
}
return0;
}
‘叁’ C语言里程序编译无误但运行会弹出程序已停止运行是为什么
造成程序停止运行弹框出错的可能原因如下:
内存溢出
内存溢出(out of memory)通俗理解就是内存不够,程序所需要的内存远远超出了主机内安装的内存所承受大小,就叫内存溢出。系统会提示内存溢出,有时候会自动关闭软件,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件
造成内存溢出的原因可能有:
1>栈区溢出,例如在main函数内开辟的数组空间过大,一般机器的栈区限制在8MB左右,如果开辟的数组大小超过限制,程序就会崩溃。通常的解决方法是申请堆内存,即将较大的数组作为全局变量开在main函数之外。
2>错误地址访问,常见的非法访问包括指针漂移,数组越界等,初学者也经常出现类似scanf函数没加区地址符号&的情况导致在读取变量的时候因非法访问造成的溢出。
3>数据类型不符,问题和第二个类似,例如在声明变量时声明为int在输出变量时却用了%lld,就会造成因数据类型不符而导致的溢出。
编译器错误
部分编译器由于所使用的标准不同(例如在一台机器上使用的可能是C99标准,而另一台机器上使用的是C11标准),或是因为编译器链接库的损坏,在少数情况下也可能导致程序出现不限于崩溃退出的异常错误,通常解决方法是到编译器官方网站下载最新版的IDE安装。
‘肆’ 为什么这个C程序一编译,编译器就停止运行
strcat用法错了吧 你看看 strcat(p1+1,p2+1)单独执行这个会报错吗 p1是指针指向这个字符串的首地址 strcat的用法是 字符串连接要求前面的要用足够的空间 我们看过这个函数的实现不敢乱说你试试吧
‘伍’ c语言中一般运行后停止工作有哪些情况
只要编译通过,一般情况下C语言程序停止工作,多为输入输出格式不对,或计算陷入死循环。
1、输入输出格式不对。最常见的就是&符号,该有的没有,不该有的打了&符号。
例如:
int n;
scanf("%d",n);
n前少打了&符号。编译能通过,执行时就会出现停止工作的情况。
2、
个别计算陷入死循环的情况,例如:
int i,k;
i赋值;
k=关于i的表达式;
计算k值陷入死循环。
‘陆’ c语言使用Dev c编译运行的时候显示最后编译文件停止工作怎么办
程序有两个错,
1.输入
scanf("%f%f%f",&trader[i].AUSvolume);
//要输入3个参数的,你只接收了一个
正确的
scanf("%f%f%f",&trader[i].AUSvolume,&trader[i].EURvolume,
&trader[i].AUSvolume);
2.输出
printf("第%d位交易员的核算值为%lf人民币\n",i+1);
//少了一个输出
正确的
printf("第%d位交易员的核算值为%lf人民币\n",
i
+
1,sum);
‘柒’ C语言程序运行后 出现exe停止工作 为什么呢
这种情况叫做 runtime error (运行时错误)。
在 Windows 7 上这样提示:
runtimeerror(运行时错误)就是程序运行到一半,程序就崩溃了。
比如说:
①除以零
②数组越界:inta[3];a[10000000]=10;
③指针越界:int*p;p=(int*)malloc(5*sizeof(int));*(p+1000000)=10;
④使用已经释放的空间:int*p;p=(int*)malloc(5*sizeof(int));free(p);*p=10;
⑤数组开得太大,超出了栈的范围,造成栈溢出:inta[100000000]
‘捌’ C语言问题,编译就停止,求大神更改,一定要可以运行
报错的原因是想要调用未赋值指针中的内容,导致出错。出错点有两个,第一个是在int initquque_link(linkqueue *queue)函数中,queue->front=hnode; queue->rear=hnode;使用这两个步骤的前提是queue的对象存在,但是在主函数中你只定义了linkqueue类型的指针j与n,但是没有给他们赋值所以在调用initquque_link函数是就报错了。在linkqueue *j,*n;这一步后面加上
linkqueue a,b;
j=&a;
n=&b;
就可以避免这个问题了。
另一个出错点在int enqueue_link (linkqueue queue,int e)函数中,这个函数应该是在队列尾部加上一个节点吧,但是为什么你要添加两个,并且没有给第二个分配内存?所以我的建议是吧第二个节点o去掉,只留p
int enqueue_link (linkqueue queue,int e)//
{
qnode *p,*o;
p=(qnode *)malloc(sizeof(qnode));
if(p==NULL) return -1;
p->next=NULL;
p->num=e;
queue.rear=p;
return 0;
}
你的代码还有一个问题,有些函数设置了不必要的形参,比如函数int dequeue_link (linkqueue *queue,int e)//
它的代码是
qnode *p=NULL;
if(queueempty_link(queue)) return -1;
p=queue->front->next;
e=p->num;
queue->front->next=p->next;
free(p);
return e;
这个函数的功能应该是删除队列的第一个节点,并把节点的值返回给函数。e这个变量并没有起到形参应有的从函数外部向函数内部传递有效数据的作用只是一般的普通变量,所以没必要放在形参的位置。其他相似的函数还有int mulv (linkqueue j,linkqueue n,int w,int e)。
‘玖’ C语言程序运行时停止工作
没看到你错误的情况,代码太长,懒得看了。
c程序死掉报个红叉叉的错误,99%都是数组越界或者指针没有初始化的滥用,看你的题目估计也是数组越界造成的问题。
你可以用调试的方法进去,重现错误,回到vc的时候,会定位到错误的地方,自己再看看应该就可以了
扫了一遍,感觉你的r数组没有定义值就开始引用了。
for(j=0;j<5;j++)
{
t=a[k][j];
a[k][j]=a[r[k]][j];
a[r[k]][j]=t;
}
这句话开始使用r,但是前面没有看到哪里给r赋值
‘拾’ 一运行C语言程序 就提示程序已经停止工作
试试重新建立工程,编译以下空代码的程序:
intmain()
{
}
如果这个空代码编译运行不出问题,说明你的程序在调用scanf或者调用指针时候有内存上的错误出现。(仔细查看代码中的scanf和指针调用时的内存使用错误,也可以把所有用到指针和scanf的地方先屏蔽,找出哪个地方内存分配不对)。
如果这个空代码运行也出问题,说明是你编译器有问题。