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的地方先屏蔽,找出哪個地方內存分配不對)。
如果這個空代碼運行也出問題,說明是你編譯器有問題。