ערכתי לאחרונה בתאריך 14.03.09 בשעה 15:05 בברכה, TTAsnn
האחת נכונה וקצת מכוערת, השניה לא נכונה וקצת פחות מכוערת אבל עדיין מכוערת 
בכל מקרה, השיטה הראשונה:
נניח ש n זה השורות ו m זה העמודות, אז:
int a[n][m];
הופך להיות
int *a = malloc(n*m *sizeof(int));
כאשר גישה לכל תא היא ככה:
a[i][j] הופך להיות:
a[i* m + j]
ויש את השיטה הלא נכונה (לדעתי)
והיא:
int **a = malloc(n *sizeof(int *));
for (i=0;i<n;i++) a[i] = malloc(m *sizeof(int));
מקווה שמובן.
היתרון של הראשון הוא הבקשה היחידה להקצאת הזכרון ולא מספר גדול יחסית של הקצאות, כנ"ל מבחינת נקיון המערך, שחרור יחיד במקום רבים.
בנוסף, הזכרון בראשון רציף ואילו בשני לא בהכרח, בקיצור, יש הרבה יתרונות לראשון.
יתרון לשני, גישה יותר רגילה לערכים.
או בקיצור, אני ממליץ על הראשון בראשון 