[問題] 幾個除錯問題

看板C_and_CPP (C/C++)作者 (布穀密語)時間7年前 (2018/07/23 13:58), 7年前編輯推噓0(0011)
留言11則, 2人參與, 7年前最新討論串1/1
各位好 最近在自學C語言 有學長給我了他之前去面試時的考題 不過我們都是程式菜逼八 題目主要為找出程式碼中有錯誤的地方 有些看不太懂哪邊有問題 要煩請各位大大解答了 謝謝 1. void test() { char a[32]; char b[48]; read(0,a,sizeof(a)); strcpy(b,a); } 2. char* fun(); void test { char *buf; int len; buf = fun(); len = strlen(buf); buf[len-1] = '\0'; } 3. int test(char *buffer) { char tmpline[256], *line; if (buffer == NULL) return 0; memset(tmpline, 0, sizeof(tmpline)); line = strncpy(tmpline, buffer, sizeof(tmpline)); if (line == NULL) return 0; line[strlen(line)] = 0; return 1; } 4. typedef struct list { char * next; } list; typedef struct z { list l; } z; void test() { z *x = malloc (sizeof(z)); if (!x) return; x->l.next=1; free(x->l.next); } 5. c假設為>=0的整數 void test() { char *x = “0123456789”; if (c) x = malloc(1); free(x); } 這題run過程式後是free(x)這邊出現error 是因為一開始指標字串x與後面分配的記憶體不一致嗎? 6. int *test(unsigned int n) { int aux; int *p; if (n == 1) { p = &aux; } else { p = (int *)malloc(n * sizeof(int)); } return p; } 此題是否為置底13誡的第5題那樣 在函式中回傳一個指向區域性自動變數的指標會失效? 以上幾題百思不得其解 麻煩各位大大為蔡逼八解惑了 感謝!! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.161.217.80 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1532325512.A.A8E.html

07/23 14:13, 7年前 , 1F
只丟程式碼誰曉得你的考題是要考什麼東西XD
07/23 14:13, 1F

07/23 14:15, 7年前 , 2F
抱歉 題目主要是找出一小段程式碼裡面可能邏輯錯的地方
07/23 14:15, 2F
※ 編輯: wind137 (118.161.217.80), 07/23/2018 14:16:46

07/23 14:43, 7年前 , 3F
123都是空字元的問題 str系列函數掃到空字元才會停
07/23 14:43, 3F

07/23 14:44, 7年前 , 4F
strn系列則是掃到第n個字元才會停
07/23 14:44, 4F

07/23 14:45, 7年前 , 5F
所以像第一題 如果我在a輸入36個非空字元
07/23 14:45, 5F

07/23 14:45, 7年前 , 6F
在strcpy的時候就會因為掃不到空字元超過邊界
07/23 14:45, 6F

07/23 14:50, 7年前 , 7F
第四題他直接把1塞給next然後再free當然炸掉
07/23 14:50, 7F

07/23 14:52, 7年前 , 8F
第五題c=0時條件式不會進 你就會free到rodata 然後炸掉
07/23 14:52, 8F

07/23 14:56, 7年前 , 9F
第六題就跟你講的一樣 不過指到區域變數的指標不會失效
07/23 14:56, 9F

07/23 14:57, 7年前 , 10F
而是很高機率在執行過程中因為stack增減導致值被蓋掉
07/23 14:57, 10F

07/23 16:03, 7年前 , 11F
感謝cutekid大大與sarafciel大大的指點!
07/23 16:03, 11F
文章代碼(AID): #1RLMw8gE (C_and_CPP)
文章代碼(AID): #1RLMw8gE (C_and_CPP)