שאלה פשוטה ב-C

mr small

New member
שאלה פשוטה ב-C

שלום לכולם, האם פונקציה יכולה להחזיר מערך של CHAR ואם כן כיצד כותבים את זה (בהגדרת הפונקציה) משהו בסגנון: (char[] func(int a int b ??? תודה מראש לעונים.
 

giladznaor

New member
תשובה

char *func(int a, int b) שים לב שהפונקציה בעצם מחזירה את הכתובת בזיכרון של תחילת המערך
 

אלדד28

New member
זה תלוי מה אתה רוצה לעשות.

אם תחזיר *char, אתה צריך להקצות דינאמית את המערך בתוך הפונקציה (למשל עם malloc) ולדאוג לשחרר אותו מחוץ לפונקציה. זה מה שקורה ב-strdup למשל. עוד נפוץ לקבל כפרמטר לפונקציה מצביע למערך ואת גודל המערך, משהו כזה -
void func(int a, int b, char *str, size_t strsize) { ... }​
אם אתה משתמש ב - ++C ולא ב-C (לא ציינת), רצוי להחזיר string ולא * char ברוב המקרים.
 

eyalbd

New member
אפשר גם להחזיר כתובת של מערך סטטי

רצוי עם const וחייב לתעד שזה עלול להשתנות בקריאה הבאה והקורא צריך להעתיק את המערך.
 

צונאמי

New member
אפשר גם כך

#include <stdio.h> #include <string.h> typedef struct _MyArray { char arr[512]; }MyArray; MyArray allocArray() { MyArray newArray; strcpy(newArray.arr, "Hello World"); return newArray; }; void main(void) { MyArray newArray; newArray = allocArray(); printf("%s\n", newArray.arr); }​
 

mr small

New member
תודה רבה

לכולם, זה נראה לי הפיתרון שמשרת את מה שאני צריך. תודה שוב.
 

צונאמי

New member
המממ...

רק רציתי להראות שאפשרי להחזיר שטח זיכרון. אבל לא עושים ככה! שים לב להעתקות הזיכרון הנוספות (מיותרות).
 

DannyBoyo

New member
הדרך הרגילה (והפשוטה גם?):

קוראים לפונקציית void שבה משנים את המערך. אם למשל ברצונך לשלוח מערך []a לפונקציה ולהחזיר את המערך ל- []b אז הגדרת הפונקציה תהיה כך:
void arr_func(char x[], char y[]);​
מהתוכנית תקרא לפונקציה כך
char a[N], b[M]; .. .. .. arr_func(a,b);​
כל שינוי שיתבצע במערך b בתוך הפונקציה יהווה שינוי על מערך b של התוכנית גם, כמו שלמדנו שמערכים שנשלחים לפונקציה אינם נשלחים לכתובות זמניות חדשות, וכל שינוי במערך בפונקציה הוא ישיר למערך בתוכנית.
 
למעלה