1樓:娜樣滴歌傑出膚
typedef struct stustu;
void f(char *p)
int main(void)
,b;a.name=(char *)malloc(10);
strcpy(a.name,"zhao");
b = a;
f(b.name);
b.gender ='f';
b.score =350;
printf("%s,%c,%d
\n",a.name,a.gender,a.score);
printf("%s,%c,%d
\n",b.name,b.gender,b.score);
return 0;
}為啥註釋掉了以後的答案變成:qian,m,290,qian,f,
350,?
而不註釋掉答案卻是: zhao,m,290,zhao
,f,350?
你的目的是通過函式去修改另外一個結構體物件b中成員name
的值。觀察到成員中的gender和score基本上沒有什麼值得研究 ,
所以只研究第一個成員name。
在你執行了**b=a的時候,b和a分別在記憶體條上佔用
sizeof(stu)的空間大小。而且,這兩個空間中的值都是一
模一樣的。
當你執行了函式f()的時候,分兩種情況。
第一沒有註釋:函式f會在棧上分配4個位元組的記憶體(sizeof
(char*),因為p的型別就是char*)。那麼p的值就是等於
b.name。
b.name的值我們假設是0x1234567,那麼現在p的值也就是
0x1234567。沒有註釋的情況下,p的值馬上被修改成malloc
的返回值,所以現在p的值一定不是0x1234567。
假如malloc的返回值是0x7654321,那麼現在p的值也就是
0x7654321。你使用了strcpy,那麼0x7654321首地址開始的
內容就變成了zhao。
所以,你沒有改變0x1234567所指向的內容。結果就是
0x1234567指向的內容還是為zhao。
第二有註釋:函式f會在棧上分配4個位元組的記憶體(sizeof
(char*),因為p的型別就是char*)。那麼p的值就是等於
b.name。
b.name的值我們假設是0x1234567,那麼現在p的值也就是
0x1234567。有註釋的時候。p的值沒有被malloc改變,還是
0x1234567.你使用了strcpy,就修改了0x1234567所指向的
記憶體。最開始的記憶體中值是zhao,你修改後就變成了qian.
你的這個例子錯誤很多,但是基於你是實驗的目的,我就不指
正了。針對不註釋的情況,如果你要改變的話,我認為比較正
確的做法應該是這樣的。
typedef struct stustu;
void f(char **p)
int main(void)
,b;a.name=(char *)malloc(10);
strcpy(a.name,"zhao");
b = a;
f(&b.name);
free(a.name);
a.name=null:
return 0;}
2樓:風若遠去何人留
p指向s,其實是指向s[0]
於是 sum上累加的三個p->score[i]就是s[0].score[0]到s[0].score[2]也就是90+95+85 = 270選b
c語言有個a同b再和c
3樓:風若遠去何人留
9 對於a>b>c 不會按照數學方式計算。而是先計算a>b 即5>4 成立,值為1.
然後計算1>c 即1>3 不成立,結果為0於是d=0
輸出011 初始s=0,i=1 每次迴圈i自加後,將i累加到s上再判斷i<3
於是s=2+3=5輸出5
4樓:育知同創教育
(9)0;
(11)初始s=0,i=1 s=2+3=5 輸出5
c語言在linux下編譯通過,一執行就段錯誤 200
5樓:jackyleung射手
linux裡面段錯誤就是記憶體訪問的錯誤了,應該是你**裡的記憶體分配有問題,因為沒看到你這裡的struct studen的具體定義,只能讓你注意看下studen的name這個字串的定義,txt檔案裡的name欄位有沒有超出這個name的定義長度,如果超出了,fscanf就會報記憶體錯誤了
6樓:匿名使用者
報什麼錯?依賴問題吧,不同系統庫檔案又不是一致的。
7樓:匿名使用者
程式不完整哦,無法測試,請給出stuscore.h及其實現。
求c語言高手寫一道程式設計題。 1、編寫程式: a.已有檔案stu1.txt,包含學生的學號、姓名及平
8樓:滄海雄風
#include
#include
struct stuinfo
;int main()
,tmp=;
char str[256]=;
fp = fopen("stu1.txt","r");
while (fgets(str,sizeof(str),fp))fclose(fp);
total = i;
for (i=0;i0)}}
fp = fopen("001.txt","w");
for (i=0;i
9樓:匿名使用者
int main()
c語言程式一執行就出現exe錯誤
10樓:匿名使用者
if(strcmp(s,stu[i].name==0)){這裡有錯誤,
strcmp是比較兩個字串的大小,你這裡應該是比較s和stu中成員變數name中的字串是否相等,正確的做法如下
if(strcmp(s,stu[i].name)==0)
11樓:匿名使用者
if(strcmp(s,stu[i].name==0))
改為if(strcmp(s,stu[i].name)==0)
括號的位置放錯了
12樓:匿名使用者
(strcmp(s,stu[i].name)==0)
用先然後再又造句,先 然後 再 又 造句
用先.然後 再 又 造句 1 清晨的太陽,先露出小小的頭,然後落到地平線下面,再冉冉升起來了,又越過高山出現在人們的上空。2 我先起床,然後穿衣服,再刷牙 洗臉,又吃了早餐,最後去上學。3 我們先燒開水,然後把調料放進去,再把羊肉片放進去,又進行了攪拌,幾分鐘後開鍋就可以吃了。延伸 造句的方法一般有...
tc執行c語言問題,TC執行c語言問題
include 找不到標頭檔案的話應該是除錯環境設定問題 int main 錯誤是標頭檔案不存在 輸出函式後沒加分號 解決找找看那個stdio.h在哪個檔案裡,放到根目錄,就是很tc.exe放在一個目錄下 輸出函式後加分號 樓主,你好,很高興能為你解答問題!1 main應該改成void main。2...
用「先然後再最後造句,用「先 再 然後 最後 」造句 30 50字左右
1 早上,我先穿衣,再刷牙,然後再洗臉,最後再吃早飯。2 我回家後,先吃飯,再做作業,然後複習,最後洗漱睡覺。3 做香蕉奶昔很簡單,先把香蕉去皮,再放入榨汁機中,把它們打碎後,再加入牛奶攪拌,最後用碗盛出來,香蕉奶昔就做成了。4 我先做語文功課,再做數學功課,然後做英語功課,最後做科學功課。首先 然...