تمرير char ** إلى وظيفة بالرجوع إليها
-
21-09-2019 - |
سؤال
تحية موسمية! لديّ وظيفة تطبع محتويات char ** التي يتم استخدامها كصفيف لتخزين عدد من الأوتار. تم إعلان مثل هذا:
char** commandArray = (char**)malloc(historySize);
حيث يكون التاريخ هو مجموعة عالمية في 8 ، في الوقت الحالي. يتم ملء المصفوفة بأوامر يدخلها المستخدم ، في نوع من قائمة الانتظار الدائرية. هناك أكثر من مكانين قد أرغب فيه في طباعة محتويات المخزن المؤقت ، لذلك قمت بوظيفة. من الناحية المثالية ، تأخذ الوظيفة في إشارة إلى CommandArray والحلقات من خلالها ، وطباعة ما تحتوي عليه. الآن ، يجب أن أقول إن المؤشرات والمراجع ليست نقطتي القوية ، لذلك لست متأكدًا مما إذا كنت أفعل الأشياء بشكل صحيح. الوظيفة تبدو هكذا:
/* prints the contents of the history buffer */
void printHistory(char*** historyBuff)
{
/* a counter for the loop */
int loopIdx = 0;
for (loopIdx = 0; loopIdx < historySize; loopIdx++)
{
/* print the current history item */
printf ("\nhistoryBuff[%i] = %s\n", loopIdx, *historyBuff[loopIdx]);
fflush(stdout);
}
}
أنا أمرر char ** إلى وظيفة مثل هذه:
printHistory (&commandArray);
كما هو الحال الآن ، كل شيء يتجمع بشكل جيد ، ولكن عندما يطبع البرنامج التاريخ ، فإن الوظيفة معلقة في مكان ما في الحلقة ولا تطبع ما هو موجود في Char **. لذا ، سؤالي لك هو: هل أنا مرضي CommandArray بشكل صحيح ، هل أعلن الوظيفة بشكل صحيح ، وهل أخلصها بالطريقة الصحيحة في الوظيفة؟
شكرا لك مقدما على أي وجميع المساعدة أو الاقتراحات!
-بن
المحلول
لجعل التعليمات البرمجية الخاصة بك تعمل كما هو ، يجب أن تكون dereference مثل هذا:
(*historyBuff)[loopIdx]
الطريقة التي كتبت بها أشياء
[]
يحدث من قبل*
بسبب أسبقية المشغل في C ، وهذا ليس ما تريد.تحتاج إلى تخصيص مساحة أكبر لمجموعة القيادة الخاصة بك. في الوقت الحالي ، ليس كبيرًا في الواقع بما يكفي للاحتفاظ به
historySize
char*
'س:char** commandArray = (char**)malloc(historySize * sizeof(char*));
لا تحتاج إلى تمرير هذا الصفيف عن طريق "المرجع". يمكنك فقط إعلان وظيفتك مثل هذه:
void printHistory(char** historyBuff)
ويمر
commandArray
مباشرة. ستحتاج فقط إلى المرور فيchar***
إذا كنت تنوي تغيير مؤشر الصفيف الفعلي في مكان ما في الوظيفة (على سبيل المثال ، إذا كنت بحاجة إلى ذلكrealloc
لجعل مساحة أكبر).للحصول على وظيفة تقوم فقط بطباعة الأشياء ، يمكنك الذهاب إلى أبعد من ذلك وإعلان الأشياء
const
. هذا "ضمان" للمتصل (بقدر ما يمكنك ضمان أي شيء في ج) أنك لن تقوم بتعديل الصفيف أو الأوتار الموجودة فيه:void printHistory(const char *const * historyBuff)
نصائح أخرى
1.
malloc
يخصص عدد من بايت, ، ليس مؤشرات. لو historySize
هل عدد مؤشرات الأحرف التي تخصصها ، ستحتاج إلى التغيير:
char** commandArray = (char**)malloc(historySize);
ل:
char** commandArray = malloc( historySize * sizeof(char*) );
2.
لك printHistory()
لا يغير commandArray
مؤشر. لا تحتاج إلى تمرير أ char***
. أ char**
سوف تفعل.