"দ্য সি প্রোগ্রামিং ল্যাঙ্গুয়েজ" বইটি কেন বলে যে আমাকে অবশ্যই ম্যালোক কাস্ট করতে হবে?


158

আজ আমি পৃষ্ঠাতে পৌঁছেছেন 167 এর সি প্রোগ্রামিং ল্যাঙ্গুয়েজ (দ্বিতীয় সংস্করণ ব্রায়ান ডব্লিউ Kernighan & ডেনিস এম রিচি) দেখলেন লেখক বলছেন যে আমি নিক্ষেপ আবশ্যক malloc। বইটির অংশটি এখানে:

7.8.5 স্টোরেজ ম্যানেজমেন্ট

ফাংশন malloc এবং কলোক গতিশীল মেমরি ব্লক প্রাপ্ত।

void *malloc(size_t n)

অনির্কিত স্টোরেজের n বাইটগুলিতে একটি পয়েন্টার দেয় বা অনুরোধটি সন্তুষ্ট না হলে NULL প্রদান করে।

void *calloc(size_t n, size_t size)

নির্দিষ্ট আকারের এন অবজেক্টগুলির একটি অ্যারের জন্য একটি পয়েন্টারটি পর্যাপ্ত ফাঁকা জায়গায়, বা অনুরোধটি সন্তুষ্ট না হলে NULL প্রদান করে। স্টোরেজ শূন্য থেকে শুরু করা হয়। ম্যালোক বা কলোকের মাধ্যমে ফিরে আসা পয়েন্টারটিতে প্রশ্নযুক্ত বস্তুর জন্য সঠিক প্রান্তিককরণ রয়েছে তবে এটি যথাযথ প্রকারের মধ্যে ফেলে দেওয়া আবশ্যক

int *ip;
ip = (int *) calloc(n, sizeof(int));

আমি ইতিমধ্যে জানি যে malloc(এবং তার পরিবার) শূন্য * টাইপ করে , এবং কেন কাস্ট করা হবে না সে সম্পর্কে ভাল ব্যাখ্যা রয়েছেmalloc

তবে আমার প্রশ্ন হল: বইটি কেন বলছে যে আমার এটি ফেলে দেওয়া উচিত?


125
কারণ বইটি পুরানো।
অলিভার চার্লসওয়ার্থ

12
কারণ এমনকি সূর্যের অন্ধকার দাগ রয়েছে, আমার উত্তর হবে। অন্য কথায়, বইটি ভুল। এটি এমন হতে পারে যে পাঠ্যটি শব্দার্থবিজ্ঞানের পূর্বে রয়েছে void *, এবং আপডেট হয়নি n't আরও দেখুন এই উত্তর
18:38

8
@ মিচি বইটিতে অনেকগুলি আসল ও টাইপোগ্রাফিক ত্রুটি রয়েছে (গুগল কে অ্যান্ডআর এরটা), এটি কেবল সি 90 স্ট্যান্ডার্ডের সাথে কিছুটা সামঞ্জস্যপূর্ণ, এটি বর্তমান সি স্ট্যান্ডার্ডকে বা 1990 সালে ভাষার কোনও পরিবর্তনকেই সম্বোধন করে না। সর্বোপরি সবচেয়ে খারাপটি এটি দিয়ে ভরা খারাপ প্রোগ্রামিং অনুশীলন, খারাপ শৈলী এবং কোড যা খারাপভাবে নির্দিষ্ট আচরণের উপর নির্ভর করে। আপনি যদি পেশাদার সি প্রোগ্রামার হয়ে যান তবে আপনাকে অবশ্যই তা শিখতে হবে।
লুন্ডিন

8
... এবং এর সাথে বৈপরীত্য করুন যখন আমি ম্যালোকের ফলাফলটি না দেই তখন সংকলকটি কেন অভিযোগ করবে? সুতরাং, সি জন্য - নিক্ষেপ করবেন না। সি ++ - এর জন্য, তবে mallocএটি ব্যবহার করবেন না কারণ এটি সি ++ নয় - আপনার যখন করা দরকার - তবে আপনার উচিত নয় - বাদে ... এজিজিএইচএইচএইচএইচ !!!!! :-)
বব জার্ভিস - মোনিকা

2
@ ম্যান্ড্রিল আপনি আমার প্রশ্নটি পড়েছেন? আপনার জন্য আমার প্রশ্নটি সম্পাদনা করতে হয়েছিল।
মিচি

উত্তর:


215

Http://computer-programming-forum.com/47-c-language/a9c4a586c7dcd3fe.htm থেকে :

প্রাক-এএনএসআই সি-তে কে ও আর -1-তে বর্ণিত হিসাবে - ম্যালোক () char * রিটার্ন দিয়েছিল এবং রিসিভ ভেরিয়েবলটিও একটি নয় এমন সমস্ত ক্ষেত্রে এর রিটার্ন মান প্রদান করা প্রয়োজন char *void *স্ট্যান্ডার্ড সি-তে নতুন ধরনের এই সংযোজনগুলিকে অপ্রয়োজনীয় করে তোলে।

কে ও আর -2-এর প্রতিরক্ষায় অযথা লাফিয়ে পড়ার বিব্রত থেকে কাউকে বাঁচাতে আমি ডেনিস রিচিকে একটি মতামত চেয়েছিলাম যে আমি পৃষ্ঠার 142 থেকে উদ্ধৃত বাক্যটির বৈধতা নিয়ে উদ্ধৃতি দিতে পারি। তিনি উত্তর দিয়েছেন:

যাই হোক না কেন, এখন আমি পি তে স্টাফটি আবার পড়ি। 142, আমি মনে করি এটি ভুল; এটি এমনভাবে লেখা হয়েছে যে এটি কেবল পূর্ববর্তী নিয়মের বিরুদ্ধে রক্ষণাত্মক নয়, এটি এএনএসআই বিধিগুলি ভুলভাবে উপস্থাপন করে।


23
সুতরাং malloc এর রিটার্ন টাইপ ছিল চার্চ এবং অকার্যকর ছিল না । ধন্যবাদ.
মিচি

10
এছাড়া ত্রুটি-বিচ্যুতি উল্লেখ করছে web.archive.org/web/20150205025553/http://cm.bell-labs.com/cm/...
টি

18
আপনার পাশের একটি কাগজে (গুলি) মুদ্রিত সেই ত্রুটিগুলি ব্যতীত আপনি এই বইটি পড়বেন না।
লুন্ডিন

4
@ মিচি - না, রিটার্নের ধরন ছিল char*, ছিল না char। দুটি সম্পূর্ণ ভিন্ন।
পিট বেকার

20
@ ডাল: ঠিক কেএন্ডআর পড়ে আপনি দুটি গুরু শুনছেন, যা যথেষ্ট ;-)
স্টিভ জেসপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.