[問題] 詢問 C 語言的問題 & 學習資源請教

看板C_and_CPP (C/C++)作者 (Allen Cheng)時間1年前 (2023/01/01 13:46), 編輯推噓4(4025)
留言29則, 8人參與, 1年前最新討論串1/1
開發平台(Platform): Mac 編譯器: GCC 額外使用到的函數庫(Library Used): uthash 問題(Question): 完整資訊請至 https://hackmd.io/@allencheng/rygXSYiTq 小弟在自學 C 語言,並嘗試用 C 來解 leetcode 題目 在 refactor test code 的時候,編譯沒問題,但執行時發生 segmentation fault source: // origin numsSize = 4; int *nums1; nums1 = (int *) malloc(numsSize * sizeof(int)); nums1[0] = 2; nums1[1] = 7; nums1[2] = 11; nums1[3] = 15; // refactor numsSize = 4; int *nums1; nums1 = (int *) malloc(numsSize * sizeof(int)); int data[] = {2, 7, 11, 15}; // 這行出錯 for (size_t i = 0;i < numsSize;i++) nums1[i] = data[1]; 檢查後發現是宣告 int array 的時候執行錯誤 有嘗試尋找問題的原因,但可能是觀念不足或不知道關鍵字 找不到可以解釋的地方 所以才來這詢問是什麼原因造成錯誤? -- 另外再請教,我是用網路上的資源跟書局翻書自學 C 語言 找不到同伴跟前輩,所以有點瞎子摸象 不曉得我目前這樣寫的方式,符不符合一般 C 語言開發的慣例或風格? 目前找到的學習資源大都只是教語法或基礎觀念, jserv 的「你所不知道的 C 語言」對經驗薄弱的我來說來有點艱澀,消化不良 想知道有沒有比較實務運用學習資源或教材? 例如手把手地的實做出一個 C 語言的軟體 / 實用的 lib 操作 目前已學完 Havard CS50, 作業有做完 CMU 15-213(CS:APP) 緩步持續努力中,但教材很「底層」,實務經驗不夠也很痛苦 XD 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 101.9.49.120 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1672551970.A.87A.html

01/01 14:17, 1年前 , 1F
問題應該是出在沒有初始化 returnSize
01/01 14:17, 1F

01/01 14:46, 1年前 , 2F
一樓說的沒初始化
01/01 14:46, 2F

01/01 14:46, 1年前 , 3F

01/01 14:47, 1年前 , 4F

01/01 15:44, 1年前 , 5F
gcc先加個flag -Wall 把所有的warning都開出來
01/01 15:44, 5F

01/01 15:47, 1年前 , 6F
你的returnSize是一個簡單的int能處理的事,在main裡面只
01/01 15:47, 6F

01/01 15:48, 1年前 , 7F
需要初始化 size_t returnSize = 0; 或把size_t換成int
01/01 15:48, 7F

01/01 15:50, 1年前 , 8F
在call function傳參數時加上&,&returnSize傳址進去。
01/01 15:50, 8F

01/01 15:58, 1年前 , 9F
您好,已補上初始化,但是變成編譯過,執行錯誤 Orz
01/01 15:58, 9F

01/01 15:58, 1年前 , 10F
有把訊息補在 hackMD link 上,請參照,謝謝
01/01 15:58, 10F

01/01 16:01, 1年前 , 11F
......請問returnSize做什麼用途,初始化為NULL是對的嗎
01/01 16:01, 11F

01/01 16:03, 1年前 , 12F
初始化是要malloc,你的twoSum裡面是直接assign value
01/01 16:03, 12F

01/01 16:03, 1年前 , 13F
,如果returnSize是NULL,當然會直接segmentation fault
01/01 16:03, 13F

01/01 16:03, 1年前 , 14F
。不然就是像Richun講的在main的returnSize改成int,然
01/01 16:03, 14F

01/01 16:03, 1年前 , 15F
後傳address 進twoSum
01/01 16:03, 15F

01/01 16:12, 1年前 , 16F
問題已解決,解決內容跟 git commit 已更新在 hackMD
01/01 16:12, 16F

01/01 16:14, 1年前 , 17F
謝謝大家的協助,搞懂問題出在哪了,會再補上解說
01/01 16:14, 17F

01/01 16:21, 1年前 , 18F
在pointer跟address那邊你應該還很不熟,還沒搞懂為什麼
01/01 16:21, 18F

01/01 16:22, 1年前 , 19F
function的宣告returnSize是用int*型態(應該size_t*更好)
01/01 16:22, 19F

01/01 16:27, 1年前 , 20F
參數型態的部分是因為 leetcode 裡面就是這樣宣告的
01/01 16:27, 20F

01/01 16:27, 1年前 , 21F
,我是先在 LC 測過,再回過頭嘗試寫測試練習 C 語言
01/01 16:27, 21F

01/01 16:27, 1年前 , 22F
01/01 16:27, 22F

01/01 18:47, 1年前 , 23F

01/01 18:48, 1年前 , 24F
01/01 18:48, 24F

01/03 12:25, 1年前 , 25F
程式風格百百種,就像口音一樣,只要參與開發的時候能
01/03 12:25, 25F

01/03 12:25, 1年前 , 26F
適應就好,更重要的事是邏輯層面的,要條理分明、精簡
01/03 12:25, 26F

01/03 12:25, 1年前 , 27F
而且完整
01/03 12:25, 27F

01/04 16:58, 1年前 , 28F
可以看 6.1810,看完會 c 跟作業系統
01/04 16:58, 28F

01/04 18:14, 1年前 , 29F
感謝推薦!我會花點時間好好研究的
01/04 18:14, 29F
文章代碼(AID): #1ZiHuYXw (C_and_CPP)
文章代碼(AID): #1ZiHuYXw (C_and_CPP)