見微知著 依舊是矩陣乘法演算法!

2022-08-20 06:09:06 字數 1443 閱讀 6551

博主上大二了,接觸linux自我認為還是乙個有小小追求的人,覺得一直漂浮在上層沒有根基,於是還是想看看linux核心,便重新看是看pointers on c紮實c語言基礎。不再急功近利,不再認為看完書就學到了知識,實踐出真知,自己動手才是王道。不多說,就用乙個以前我寫過的例子嘲諷以前的我吧!

還是一樣的,pointers on c的chapter8的第五個程式設計小題。

函式原型

void matrix_multiply ( int *m1 , int *m2 ,int *r , int x , int y , int z );

//其中m1是第乙個陣列,m2是第二個陣列,m3是輸出陣列x,y是m1陣列的行列號,y,z是m2的行列號

先看第一遍的

void matrix_multiply ( int *m1 , int *m2 , 

int *r , int x , int y , int z )

} }}

演算法很簡單,我的思路再反覆確定之後認為沒有錯誤,但是編譯執行之後一直會出現,segmentation fault (core dumped)也就是傳說中的陣列越界。想了一下才明白問題的所在——r,m1,m2不是陣列名!

假設有陣列名a,那麼&a會是當前的位址,並且假設a是一維陣列,那麼&a就是從列指標轉化為行指標,具體的例項可以假設int a[10];只需要printf一下a+1的位址和&a+1的位址結果就顯而易見!但是在這個題目中,不會將m1,m2,r當做陣列名的,即使你將函式原型改為int m1這樣的也可以,這裡會當做是變數來處理。由於這裡函式原型中的形參是*m1,*m2,*r這樣的列指標,我想當然的認為這裡可以轉化行指標來處理,但實際上並不可以,因為這裡是在堆疊中的變數。

那麼問題究竟出在**那?

參考乙個例子

firstfile.c:

int a[10];

int *b=a;

secondfile.c:

extern int *a;

extern int b;

那麼a[3]和b[3]的值會是什麼那?這裡由於第二個檔案中會把a當做指標變數處理,取出指標變數位置中儲存的值,再加上3*sizeof(int)得到乙個值,再對得到的值解引用,取出那個位置中的值,而實際上a是陣列名,那麼最後的結果就是取出(a[0]+12)這個位址的值。(這個訪問一般情況下是非法的)

而這裡會將b當做是陣列名,直接將b的位址加上12再解引用取值,這裡也會是非法訪問的。

其實仔細想想,就是乙個根本區別——變數會建立空間,而陣列名不會!

經過以上的思想掙扎之後我發現這裡只能用列指標來進行操作,所以第二遍我就是對的了,嘿嘿!

void matrix_multiply ( int *m1 , int *m2 , 

int *r , int x , int y , int z )

} }}

雖然只是改了一行,但是我還是感覺蠻好的!

DayTen 依舊是筆記呀

c 中讀取一整行資料時,可以採用string類庫中的getline 函式 具體使用 getline cin,str 這樣讀入的資料就是包含輸入的空格,方便後續的操作。以下這一點 可以將輸入的字元按空格分割放入棧中 stack stk string str getline cin,str string...

HDFS依舊是儲存的王者

讓我們帶著這個問題來了解hdfs的架構與原理,我一直認為學習大資料最好的方法就是看官網。所以對初學者來說一定要多看官網,哪怕你看不懂英文,也要用軟體翻譯過來看。首先來看下官方介紹 hadoop分布式檔案系統 hdfs 是一種分布式檔案系統,設計用於在商用硬體上執行。它與現有的分布式檔案系統有許多相似...

概念,依舊是概念 csproj檔案是做什麼用的?

本來今天是在寫一篇關於linq的文章,不過寫著寫著忽然覺得有些找不著北的感覺,似乎有點過於發散了?於是來逛了一下,正好發現有朋友發了一篇文章 net面試題,看看你的水平 於是就在這篇文章裡和目前正紅火的小包子同學為某個問題進行了一番爭論。而在吵吵鬧鬧的過程中看到這麼一句話 pdb檔案需要放在debu...