יום ראשון, 18 בדצמבר 2016

שפת C - פקודת realloc (יום ראשון)

פקודת realloc

מאמר מאת ויקיספר:


פונקציית שינוי-ההקצאה realloc

שינויי הקצאות אפשר לעשות בעזרת הפונקציה realloc, על ידי קריאות מהצורה הבאה:
realloc(<old_ptr>, <total_size>)
כאשר old_ptr היא כתובת הזיכרון המוקצאת הנוכחית, וtotal_size הוא הגודל החדש המבוקש (בבתים).
מערכת ההפעלה תנסה לראות האם אפשר לשנות את רצף הזיכרון הנוכחי לגודל המבוקש. אם הדבר אפשרי, הפונקציה תחזיר את כתובת הזיכרון של הרצף הנוכחי כvoid * (בדיוק כפי שראינו מקודם בהקצאה). אם הדבר אינו אפשרי, היא תבדוק האם יש רצף אחר מתאים בזיכרון. אם היא הצליחה, היא תעתיק את תוכן הרצף הנוכחי לרצף החדש, תשחרר את הרצף הנוכחי, ותחזיר את כתובת הרצף החדש. אם אין רצף אחר מתאים בזיכרון, היא לא תשנה כלום בזיכרון (ובפרט, לא תשחרר את הרצף הנוכחי), ותחזיר NULL כדי לסמן שלא הצליחה.

שני התרשימים הבאים מראים מצב אפשרי בו realloc תחזיר כתובת זיכרון שונה מהכתובת הנוכחית. תחילה נראה הזיכרון כך:
הערימה לפני שינוי ההקצאה.
שני רצפים נמצאים כעת בזיכרון: אחד מתאים למצביע chars, והשני למצביע אחר py. אפשר להאריך את רצף הזיכרון הנוכחי של chars בתו אחד, אך לא בשניים. הפונקציה realloc תזהה שקיים רצף אחר גדול מספיק, תקצה אותו, תעתיק את שלושת התווים אליו, תשחרר את הרצף הנוכחי, ותחזיר את הכתובת החדשה. לאחר שנשים את הכתובת החדשה בchars, ייראה הזיכרון כך:
הערימה לאחר הקצאות.












פתרונות מהשיעור הקודם ומה שעשינו על הלוח:


/*
#include <stdio.h>
#include <stdlib.h>
void main() {
 int n  , *p=NULL , i , num , sum = 0;
 
 for(n=0; 1 ; n++) {
  printf("Enter number: ");
  scanf("%d",&num);
  if(num < 0)
   break;
  p = (int *)realloc(p, (n+1) *sizeof(int) );
  p[n] = num;
 }
 
 for(i=0; i<n; i++) {
  printf("%d ",p[i]);
  sum += p[i];
 }
 printf("\nSum: %d\n",sum);
}
 
 
 
/////////////////////////////////// Exe No' 2
#include <stdio.h>
#include <stdlib.h>
void main() {
 int *A, *B, *C,  i , j , k, n , m;
 printf("Enter n & m:   ");
 scanf("%d %d",&n, &m);
 
 A = (int *)malloc(n * sizeof(int) );
 B = (int *)malloc(m * sizeof(int) );
 C = (int *)malloc((n+m) * sizeof(int) );
 if(A==NULL || B==NULL || C==NULL) {  //if(!A || !B || !C) {
  printf("No enogth memory\n");
  exit(0);
 }
 printf("Enter %d sorted numbers: \n",n);
 for(i=0; i<n; i++)
  scanf("%d",&A[i]);
 printf("Enter %d sorted numbers: \n",m);
 for(i=0; i<m; i++)
  scanf("%d",&B[i]);
 
 for(i=j=k=0; i<n && j<m; ) {
  if(A[i] < B[j])
   C[k++] = A[i++];
  else
   C[k++] = B[j++];
 }
 
 for( ; i < n; C[k++] = A[i++]) ;
 for( ; j < m; C[k++] = B[j++]) ;
 
 for(i=0; i<n+m; i++)
  printf("%d ",C[i]);
 putchar('\n');
 
 free(A);
 free(B);
 free(C);
}
 
 
 
/////////////////////////////////// Exe No' 3 version a
#include <stdio.h>
#include <stdlib.h>
void main() {
 char str[80] , *s1, *s2, *s3, *s4;
 int i , a, b, c, d;
 printf("Enter string:\n");
 gets( str );
 for(a=b=c=d=i=0; str[i]; i++) {
  if(str[i]>='A' && str[i]<='Z') a++;
  else
  if(str[i]>='a' && str[i]<='z') b++;
  else
  if(str[i]>='0' && str[i]<='9') c++;
  else d++;
 }
 s1 = (char*) malloc(a + 1);
 s2 = (char*) malloc(b + 1);
 s3 = (char*) malloc(c + 1);
 s4 = (char*) malloc(d + 1);
 
 for(a=b=c=d=i=0; str[i]; i++) {
  if(str[i]>='A' && str[i]<='Z') s1[a++] = str[i];
  else
  if(str[i]>='a' && str[i]<='z') s2[b++] = str[i];
  else
  if(str[i]>='0' && str[i]<='9') s3[c++] = str[i];
  else s4[d++] = str[i];
 }
 
 s1[a] = s2[b] = s3[c] = s4[d] = NULL;
 
 puts(s1);
 puts(s2);
 puts(s3);
 puts(s4);
 
 free(s1);
 free(s2);
 free(s3);
 free(s4);
}
 
*/
 
/////////////////////////////////// Exe No' 3 version b
#include <stdio.h>
#include <stdlib.h>
void main() {
 char str[80] , *s1, *s2, *s3, *s4;
 int i , a, b, c, d;
 printf("Enter string:\n");
 gets( str );
 s1=s2=s3=s4 = NULL;
 for(a=b=c=d=i=0; str[i]; i++) {
  if(str[i]>='A' && str[i]<='Z') {
   s1 = (char*) realloc(s1,++a);
   s1[a-1] = str[i];  
  }
  else
  if(str[i]>='a' && str[i]<='z') {
   s2 = (char*) realloc(s2, ++b);
   s2[b-1] = str[i];  
  }
  else
  if(str[i]>='0' && str[i]<='9') {
   s3 = (char*) realloc(s3, ++c);
   s3[c-1] = str[i];  
  }
  else{
   s4 = (char*) realloc(s4, ++d);
   s4[d-1] = str[i];  
  }
 } 
 s1 = (char*) realloc(s1, ++a);
 s2 = (char*) realloc(s2, ++b);
 s3 = (char*) realloc(s3, ++c);
 s4 = (char*) realloc(s4, ++d);
 
 s1[a-1] = s2[b-1] = s3[c-1] = s4[d-1] = NULL;
 
 puts(s1);
 puts(s2);
 puts(s3);
 puts(s4);
 
 free(s1);
 free(s2);
 free(s3);
 free(s4);
}











תעמדו בקצב!

אין תגובות:

הוסף רשומת תגובה