سؤال

اعتقدت أن تعيين العنصر الأول على قيمة خالية سيؤدي إلى مسح محتويات مصفوفة char بالكامل.

char my_custom_data[40] = "Hello!";
my_custom_data[0] = '\0';

ومع ذلك، يؤدي هذا فقط إلى تعيين العنصر الأول إلى قيمة فارغة.

أو

my_custom_data[0] = 0; 

بدلا من الاستخدام memset, أعتقد أن المثالين أعلاه يجب أن يمسحا جميع البيانات.

هل كانت مفيدة؟

المحلول

وذلك يعتمد على الطريقة التي تريد لعرض مجموعة. إذا كنت تقوم بعرض مجموعة على شكل سلسلة من حرف، ثم السبيل الوحيد لطرد البيانات غير للمس كل دخول. memset ربما هو أنجع وسيلة لتحقيق ذلك.

ومن ناحية أخرى، إذا كنت اختيار لعرض هذا النحو C / C ++ فارغة إنهاء السلسلة، ووضع البايت الأول ل0 إرادة واضحة على نحو فعال السلسلة.

نصائح أخرى

وهناك مجموعة في C هو مجرد موقع الذاكرة، لذلك الواقع، وتعيين my_custom_data[0] = '\0'; الخاص بك ببساطة يضع العنصر الأول إلى الصفر، ويترك عناصر أخرى سليمة.

إذا كنت تريد مسح جميع عناصر مجموعة، سيكون لديك لزيارة كل عنصر. هذا هو ما memset ل:

memset(&arr[0], 0, sizeof(arr));

وهذا هو عموما أسرع وسيلة لرعاية هذا. إذا كان يمكنك استخدام C ++، والنظر في الأمراض المنقولة جنسيا :: ملء بدلا من ذلك:

char *begin = &arr;
char *end = begin + sizeof(arr);
std::fill(begin, end, 0);

وماذا كنت تعتقد تحديد عنصر واحد من شأنه أن مسح مجموعة كاملة؟ في C، خصوصا، قليلا يحدث من أي وقت مضى من دون مبرمج برمجة بشكل صريح. إذا قمت بتعيين العنصر الأول إلى صفر (أو أي قيمة)، ثم كنت قد فعلت ذلك بالضبط، لا أكثر ولا أقل.

عند تهيئة يمكنك وضع مجموعة من الصفر:

char mcd[40] = {0}; /* sets the whole array */

وعلى خلاف ذلك، وأنا لا أعرف أي تقنية أخرى من memset، أو شيئا من هذا القبيل.

استخدم:

memset(my_custom_data, 0, sizeof(my_custom_data));

وأو:

memset(my_custom_data, 0, strlen(my_custom_data));

وحاول البرمجية التالية:

void clean(char *var) {
    int i = 0;
    while(var[i] != '\0') {
        var[i] = '\0';
        i++;
    }
}

لماذا لا تستخدم memset()؟ هذه هي الطريقة للقيام بذلك.

وتحديد العنصر الأول يترك بقية الذاكرة يمسها، ولكن وظائف STR علاج البيانات كما فارغة.

والثابتة والمتنقلة تجد أدناه حيث شرحتها مع البيانات في مجموعة بعد حالة 1 و 2 حالة.

char sc_ArrData[ 100 ];
strcpy(sc_ArrData,"Hai" );

وحالة 1:

sc_ArrData[0] = '\0';

والنتيجة:

-   "sc_ArrData"
[0] 0 ''
[1] 97 'a'
[2] 105 'i'
[3] 0 ''

وحالة 2:

memset(&sc_ArrData[0], 0, sizeof(sc_ArrData));

والنتيجة:

-   "sc_ArrData"
[0] 0 ''
[1] 0 ''
[2] 0 ''
[3] 0 ''

وعلى الرغم من وضع الوسيطة الأولى إلى NULL سوف تفعل خدعة، وذلك باستخدام memset ينصح

وكلا. كل ما تقوم به هو وضع القيمة الأولى إلى '\ 0' أو 0.

إذا كنت تعمل مع اغية إنهاء الجمل، ثم في المثال الأول، وستحصل على السلوك الذي يحاكي ما كنت تتوقع، ولكن الذاكرة لا يزال تعيين.

إذا كنت ترغب في مسح الذاكرة دون استخدام memset، واستخدام للحلقة.

ويجب عليك استخدام memset. ووضع فقط العنصر الأول لا تعمل، تحتاج إلى تعيين جميع العناصر - إذا لم يكن كذلك، كيف يمكن لكم فقط تعيين العنصر الأول إلى 0

والكتابة حرف فارغة إلى الحرف الأول يفعل ذلك بالضبط. إذا كنت التعامل معها على أنها سلسلة، سوف كود طاعة حرف إنهاء باطل التعامل معها على أنها سلسلة فارغة، ولكن ليس هذا هو نفس إزالة البيانات. إذا كنت فعلا تريد لمسح البيانات التي سوف تحتاج إلى استخدام memset.

فكرت من خلال تعيين العنصر الأول على خالية من شأنه أن يزيل محتويات صفيف شار بالكامل.

وهذا غير صحيح كما اكتشفت

ومع ذلك ، فإن هذا يعين فقط العنصر الأول على Null.

بالضبط!

تحتاج إلى استخدام memset لمسح جميع البيانات، ولا يكفي تعيين أحد الإدخالات على قيمة خالية.

ومع ذلك، إذا كان تعيين عنصر من المصفوفة على قيمة خالية يعني شيئًا خاصًا (على سبيل المثال عند استخدام سلسلة منتهية خالية) فقد يكون كافيًا تعيين العنصر الأول على قيمة خالية.بهذه الطريقة سيفهم أي مستخدم للمصفوفة أنها فارغة على الرغم من أن المصفوفة لا تزال تحتوي على الأحرف القديمة في الذاكرة

وتعيين العنصر الأول إلى NULL. وطباعة مجموعة شار تعطيك شيء إلى الخلف.

وماذا عن ما يلي:

bzero(my_custom_data,40);

وأنا عادة مجرد قيام مثل هذا:

memset(bufferar, '\0', sizeof(bufferar));
void clearArray (char *input[]){
    *input = ' '; 
}

وحاول القيام بما يلي:

strcpy(my_custom_data,"");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top