سؤال

ونظرا لهذا كود C جمعتها مع دول مجلس التعاون الخليجي 4.3.3

#include <stdio.h>
#include <stdlib.h>


int main(int argc, char * argv[])
{

    int * i;

    i = (int *) malloc(sizeof(int));

    printf("%d\n", *i);
    return 0;

}

وأتوقع أن يكون الناتج مهما كان في الذاكرة التي يعود malloc () ولكن بدلا من ذلك الناتج هو 0. هل malloc التصفير من الذاكرة فإنه يعود؟ إذا كان الأمر كذلك، لماذا؟

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

المحلول

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

نصائح أخرى

وظيفة malloc() لا يتم تعيين الذاكرة المخصصة إلى أي قيمة محددة. إذا كنت ترغب في التأكد من أن الذاكرة هي صفر، واستخدام calloc() أو ما يعادلها. خلاف ذلك، يمكنك الحصول على كل ما ما كان موجودا من قبل (والتي قد تكون في الحالة الخاصة بك، يكون صفرا).

وتكون غير معرفة القيمة في الذاكرة المخصصة رسميا. يذكر C99: The malloc function allocates space for an object whose size is specified by size and whose value is indeterminate. malloc () يمكن أن تفعل ما تشاء، بما في ذلك التصفير بها. وهذا قد يكون متعمدا، من الآثار الجانبية للتنفيذ، أو قد يكون لديك فقط الكثير من الذاكرة التي يحدث أن تكون 0.

وFWIW على OS X مع دول مجلس التعاون الخليجي أبل 4.0.1 لا أستطيع جعله يخرج ليست 0 حتى تفعل الكثير من المخصصات:

for( idx = 0; idx < 100000; idx++ ) {
    i = (int *) malloc(sizeof(int));
    printf("%d\n", *i);
}

وMalloc لم يكن لديك لملء الذاكرة. لأسباب تتعلق بالأداء، الإصدارات الافراج في كثير من الأحيان لا تفعل شيئا مع الذاكرة. قد يكون هناك "آمنة" المكتبة تنفيذ malloc الذي يمسح الذاكرة. والأمر متروك المنفذ المكتبة. هناك بعض الأنماط الشائعة التي تمتلئ في الذاكرة من قبل المكتبات التصحيح مختلف البرمجي التي هي <وأ href = "https://stackoverflow.com/questions/370195/when-and-why-will-an-os-initialise-memory- وأوضح ل0xcd-0xdd-الخ على اساس جديد خال من-malloc "> في هذا الموضوع ستاكوفيرفلوو .

وأنت بالتأكيد لا يمكن أن تعتمد على كونها 0. malloc قسما أكبر وتفريغ لنرى.

وإذا كان الباحث فيه؛ كثافة العمليات = 0؛ أو كثافة العمليات = 00000000. ه يذهب لتناول نفس المساحة في الذاكرة. سوف printf في كثير من الأحيان قبض على أول 0 كما فاصل لاغية بغض النظر عن ما هو موجود في السلسلة. إذا كنت تستخدم المقارنة سلسلة و0 عنصرا نائبا أنصح لك استخدام أي شيء ولكن 0 لأن صاحب المكان كما مكتبات جملة مبنية تمتص حقا. محاولة F ثم كتابة التحكم في نفسك إدراج مصطلح خالية أو سطر جديد حسب الحاجة سواء كان ذلك سيكون وسيلة أكثر المحمولة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top