কেন আমি realloc () সঙ্গে একটি ডবল বিনামূল্যে ত্রুটি পেয়েছি?

আমি একটি স্ট্রিং প্রতিস্থাপন ফাংশন লিখতে চেষ্টা করেছেন সি, যা একটি গৃহস্থালি * এ কাজ করে যা malloc() ব্যবহার করে বরাদ্দ করা হয়েছে। এটা একটু ভিন্ন যে এটি স্ট্রিং খুঁজে পেতে এবং প্রতিস্থাপিত হবে, শুরুর স্ট্রিং অক্ষরের পরিবর্তে।

যদি অনুসন্ধান এবং প্রতিস্থাপিত স্ট্রিং একই দৈর্ঘ্য হয় (বা প্রতিস্থাপিত স্ট্রিং অনুসন্ধান স্ট্রিং তুলনায় ছোট) এটি থেকে তুচ্ছ করা, কারণ আমার পর্যাপ্ত স্থান বরাদ্দ আছে। যদি আমি realloc() ব্যবহার করার চেষ্টা করি, তাহলে আমি একটি ত্রুটি পেয়েছি যা আমাকে বলে যে আমি একটি দ্বিগুণ মুক্ত কাজ করছি - যা আমি দেখতে পাচ্ছি না যেহেতু আমি শুধুমাত্র realloc ব্যবহার করছি ) </কোড>।

সম্ভবত একটি সামান্য কোড সাহায্য করবে:

void strrep(char *input, char *search, char *replace) {
    int searchLen = strlen(search);
    int replaceLen = strlen(replace);
    int delta = replaceLen - searchLen;
    char *find = input;

    while (find = strstr(find, search)) {

        if (delta > 0) {
            realloc(input, strlen(input) + delta);
            find = strstr(input, search);            
        }

        memmove(find + replaceLen, find + searchLen, strlen(input) - (find - input));
        memmove(find, replace, replaceLen);
    }
}

প্রোগ্রামটি কাজ করে না যতক্ষন না আমি realloc() এ একটি উদাহরণে চেষ্টা করব যেখানে প্রতিস্থাপিত স্ট্রিং প্রাথমিক স্ট্রিং এর চেয়ে দীর্ঘতর হবে। (এটি এখনও ধরনের কাজ, এটি ঠিক ত্রুটি spits পাশাপাশি ফলাফল spits)।

যদি এটি সাহায্য করে, তবে কলিং কোডটি দেখায়:

#include 
#include 
#include 

void strrep(char *input, char *search, char *replace);

int main(void) {
    char *input = malloc(81);

    while ((fgets(input, 81, stdin)) != NULL) {
        strrep(input, "Noel", "Christmas");
    }
}
0
ro fr hi

12 উত্তর

আপনি একটি সিরিয়াল ইন্টারফেস সহ ওয়াইফাই মডিউল কিনতে পারেন তবে তারা একটি সামান্য pricy মূলত আপনি তাদের UART এর মাধ্যমে নিয়ন্ত্রণ করুন, এবং আপনি এগুলি এট কমান্ডগুলি যেমন ডায়াল-আপ মোডেমগুলিকে আপনি পুরানো দিনের মধ্যে নিয়ন্ত্রন করেন একইভাবে পাঠিয়েছেন।

WiFi module

5
যোগ
এটি একটি মহান ধারণা, এবং আমি এটি সঙ্গে একটি ব্রেকআউট বোর্ড পাওয়া এমনকি ইন্টিগ্রেশন এমনকি সহজ করতে। আমার শুধুমাত্র রিজার্ভেশন শক্তি প্রয়োজনীয়তা এবং আকার ছিল আপনার পরামর্শের জন্য ধন্যবাদ! আমি ভবিষ্যতে প্রকল্প জন্য স্পষ্টভাবে এই মনে রাখবেন :-)
যোগ লেখক Mario Marinato, উৎস

একটি বিট আরো বিস্তৃত।

দেরকে পরামর্শ দিলাম যে আমি কীভাবে পরামর্শ দিতে যাচ্ছি। রাউটিং নেটওয়ার্কগুলি বিটি মডিউলগুলির একটি ভাল সেটও তৈরি করে।

প্রসারিত করতে. ZigBee Wi-Fi থেকে সম্পূর্ণরূপে একটি পৃথক প্রোটোকল। ZigBee বিকিরণ ক্ষমতার বিটি অনুরূপ, যা পরিসীমা একটি বড় পরিমাণ relates, কিন্তু এটি একাধিক নোড একটি নেটওয়ার্ক তৈরি করতে অনুমোদিত হয়েছে যে ভিন্ন, প্রতিটি নোড কার্যকরভাবে এটি এর পরিসীমা দ্বারা নেটওয়ার্ক বিস্তৃত বিস্তৃত। আমি আশা করি এই পরিষ্কার হবে যে তারা অনুরূপ কিন্তু সম্পর্কিত না

3
যোগ
তথ্যের জন্য ধন্যবাদ আমি কিছু প্রশ্ন আপ পরিষ্কার সাহায্য :)
যোগ লেখক Mario Marinato, উৎস

শুধু আপনার সব আপনার বর্তমান সমাধান ভাগ চেয়েছিলেন:

লিটলব্রাইডে ইলেকট্রনিক্সে মার্কাস এবং মেডেলিনের সাথে চ্যাটিং করার পর, আমরা নিম্নলিখিত সম্ভাব্য সমাধান নিয়ে এসেছি:

1) লিবিয়াপ্যাডে Xbee,

2) USB Arduino, ইথারনেট Sheild এবং Xbee কম্বো WWW যাও বার্তা স্থানান্তর।

এটি কেবল অনেক সম্ভাব্য সমাধানগুলির মধ্যে একটি, কিন্তু আমার জন্য এটি lilpad এ সরাসরি 802.11 ব্যবহার করার পরিবর্তে xbee ব্যবহার করে lilypad শেষে কম শক্তি এবং আকারের প্রয়োজনীয়তাগুলি উপলব্ধ বলে মনে হচ্ছে।

পাশাপাশি, আমি ইতিমধ্যে একটি অতিরিক্ত Arduino এবং ইথারনেট ঢাল অবহিত হচ্ছে ছিল, এবং একটি অজুহাত xbee সঙ্গে খেলতে চেয়েছিলেন! ;-)

আপনার ইনপুট জন্য সমস্ত ধন্যবাদ! এটি একটি সমাধান উদ্ভাবনের মধ্যে খুব দরকারী ছিল।

3
যোগ
আমরা উভয় বিবেচিত, কিন্তু আমরা পাওয়া মডিউল ব্যয়বহুল এবং বিদেশী ছিল। আমি ইতিমধ্যে একটি Arduino এবং একটি ইথারনেট ঢাল ছিল দেওয়া, এটি একটি সামান্য সহজ হয়ে ওঠে :-) আপনার পরামর্শ জন্য অনেক ধন্যবাদ!
যোগ লেখক Mario Marinato, উৎস
আমি মনে করি সমাধান আমার দ্বারা প্রস্তাবিত সস্তা হবে। কিন্তু হয়তো আপনার আরও কঠিন, কম্প্যাক্ট এবং সহজ নির্মাণ। এবং আপনি পিতামহ হার্ডওয়্যার ইতিমধ্যে
যোগ লেখক Chris Bunch, উৎস

আমি কি আমার হোম রাউটারের সাথে XBee মডিউল ব্যবহার করতে পারি?

হ্যাঁ কিন্তু আপনি আপনার রাউটার XBee মডিউল সাথে সংযোগ প্রয়োজন। আপনার রাউটারের USB পোর্টের যদি আপনি আপনার রাউটার বোর্ডে সিরিয়াল পোর্ট বা সিরিয়াল অ্যাডাপ্টারে ইউএসবি খুঁজে পেতে চেষ্টা করতে পারেন। এছাড়াও আপনার রাউটার লিনাক্স (সম্ভবত openWRT) এর অধীনে কাজ করা উচিত।

1
যোগ

একটি সাধারণ নিয়ম হিসাবে, আপনি কখনো একটি ব্যবহারকারী প্রদান বাফারের উপর একটি বিনামূল্য বা realloc করা উচিত। আপনি কোথায় ব্যবহারকারীর স্থান (আপনার মডিউল, অন্য DLL তে) বরাদ্দ করা হয় তা জানেন না যাতে আপনি একটি ব্যবহারকারীর বাফারের মধ্যে কোনও বরাদ্দকরণ ফাংশন ব্যবহার করতে পারেন না।

যেহেতু আপনি এখন আপনার ফাংশনের মধ্যে কোনও পুনঃঅর্থায়ন করতে পারেন না, তবে আপনি তার আচরণকে সামান্য পরিবর্তন করতে পারেন, যেমনটি কেবলমাত্র একটি প্রতিস্থাপন করা, যাতে ব্যবহারকারী ফলাফলের দৈর্ঘ্যকে সর্বাধিক দৈর্ঘ্য গণনা করতে সক্ষম হয় এবং এই একের জন্য যথেষ্ট পরিমাণে বাফার সরবরাহ করে প্রতিস্থাপন ঘটতে।

তারপর আপনি একাধিক প্রতিস্থাপন করতে আরেকটি ফাংশন তৈরি করতে পারে, তবে আপনাকে পরিণামে স্ট্রিং জন্য পুরো স্থান বরাদ্দ করতে হবে এবং ব্যবহারকারী ইনপুট স্ট্রিং কপি করবে। তারপর আপনি বরাদ্দ করা স্ট্রিং মুছে ফেলার একটি উপায় প্রদান করতে হবে।

ফলাফল:

void  strrep(char *input, char *search, char *replace);
char* strrepm(char *input, char *search, char *replace);
void  strrepmfree(char *input);
0
যোগ

আমার দ্রুত ইঙ্গিত।

Instead of:
void strrep(char *input, char *search, char *replace)
try:
void strrep(char *&input, char *search, char *replace)

and than in the body:
input = realloc(input, strlen(input) + delta);

সাধারণভাবে ফাংশন আর্গুমেন্ট মান / রেফারেন্স এবং realloc() বর্ণনা হিসাবে প্রেরণ সম্পর্কে পড়া :)।

0
যোগ
সংকেত <�কোড> অকার্যকর strrep (গৃহস্থালি * এবং ইনপুট, গৃহস্থালি * অনুসন্ধান, গৃহস্থালি * প্রতিস্থাপন করুন) </কোড> সি মধ্যে বৈধ নয়? যদিও এটি C ++ এ বৈধ প্রশ্ন হল না, এবং AFAICT কখনও ছিল না, C ++ দিয়ে ট্যাগ করা হয়েছে সবচেয়ে ভাল হয়, কোড অকার্যকর strrep (গৃহস্থালি ** ইনপুট, গৃহস্থালি * অনুসন্ধান, গৃহস্থালি * প্রতিস্থাপন করা উচিত) হওয়া উচিত, যদিও এটি তর্ক করা সহজ যে char * strrep (const char * ইনপুট, const char * অনুসন্ধান, const গৃহস্থালয়ে * প্রতিস্থাপন) একটি কার্যকর ইন্টারফেস (ইনপুট স্ট্রিংগুলি পরিবর্তন করা হয় না; সংশোধনকৃত স্ট্রিং বরাদ্দকৃত এবং ফেরত দেওয়া হয়
যোগ লেখক Jonathan Leffler, উৎস

নোট করুন, HTML এপ্লিক কোডগুলি পরিত্রাণ পেতে আপনার কোড সম্পাদনা করার চেষ্টা করুন।

ভাল, যদিও আমি C / C ++ ব্যবহার করতাম, যদিও এটি মূলত স্মরণ পয়েন্টারের মানকে পুনরায় ব্যবহার করে, যদি আপনার মূল ব্লকের পরে মেমোরিতে জায়গা থাকে তবে Callon

উদাহরণস্বরূপ, এই বিবেচনা করুন:

(Xxxxxxxxxx ..........)

যদি আপনার পয়েন্টার প্রথম এক্স নির্দেশ করে, এবং। মানে বিনামূল্যে মেমরি অবস্থান, এবং আপনি 5 বাইট দ্বারা আপনার পরিবর্তনশীল দ্বারা নির্দেশিত মেমরি আকার হত্তয়া, এটি সফল হবে এই অবশ্যই একটি সহজ উদাহরণ হিসাবে ব্লক প্রান্তিককরণের জন্য একটি নির্দিষ্ট আকার পর্যন্ত বৃত্তাকার হয়, কিন্তু যাই হোক না কেন।

যাইহোক, যদি আপনি পরবর্তীতে অন্য 10 বাইট দ্বারা এটি বৃদ্ধি করার চেষ্টা করেন, এবং শুধুমাত্র 5 উপলব্ধ থাকে, তাহলে ব্লকটিকে মেমরিতে সরাতে হবে এবং আপনার পয়েন্টারটি আপডেট করতে হবে।

যাইহোক, আপনার উদাহরণে আপনি ফাংশন চরিত্রের একটি পয়েন্টার পাশ করা হয়, আপনার ভেরিয়েবলের একটি পয়েন্টার না, এবং এইভাবে যখন strrep ফাংশন অভ্যন্তরীণভাবে ভেরিয়েবলটি ব্যবহার করতে সক্ষম হতে পারে, এটি একটি স্থানীয় ভেরিয়েবল যা strrep ফাংশন এবং আপনার কলিং কোডটি মূল পয়েন্টার ভেরিয়েবলের সাথে ছেড়ে দেওয়া হবে।

এই পয়েন্টার মান, যদিও, মুক্ত করা হয়েছে।

আপনার ক্ষেত্রে, ইনপুট অপরাধী হয়।

যাইহোক, আমি অন্য একটি পরামর্শ করতে হবে। আপনার ক্ষেত্রে এটি ইনপুট পরিবর্তনশীল প্রকৃতপক্ষে ইনপুট দেখায়, এবং যদি এটি হয় তবে এটি সংশোধন করা উচিত নয়।

এভাবে আমি ইনপুট পরিবর্তন ছাড়া, আপনি যা করতে চান তা করতে আরেকটি উপায় খুঁজে বের করার চেষ্টা করবেন, কারণ এই ধরনের পার্শ্ব প্রতিক্রিয়াগুলি ট্র্যাক করা কঠিন হতে পারে।

0
যোগ

এই কাজ বলে মনে হয়;

char *strrep(char *string, const char *search, const char *replace) {
    char *p = strstr(string, search);

    if (p) {
        int occurrence = p - string;
        int stringlength = strlen(string);
        int searchlength = strlen(search);
        int replacelength = strlen(replace);

        if (replacelength > searchlength) {
            string = (char *) realloc(string, strlen(string) 
                + replacelength - searchlength + 1);
        }

        if (replacelength != searchlength) {
            memmove(string + occurrence + replacelength, 
                        string + occurrence + searchlength, 
                        stringlength - occurrence - searchlength + 1);
        }

        strncpy(string + occurrence, replace, replacelength);
    }

    return string;
}

সন্ধ্যায়, এটি ছাড়াও কোড পোস্ট করার কোন উপায় আছে?

0
যোগ
একটি মন্তব্য যুক্ত করা, যেহেতু মন্তব্য একটি উত্তর হিসাবে লেখা ছিল, মন্তব্য করার আগে পাওয়া যায়: যে শুধুমাত্র প্রথম ঘটনা পরিবর্তন বলে মনে হয়। যা সম্ভবত যুক্তিসঙ্গত, কারণ আমি সত্যিই এটি তাদের সব পরিবর্তন করতে হবে যে রাষ্ট্র না!
যোগ লেখক Matthew Schinckel, উৎস

কেউ অন্য দলকে দেরী করার জন্য ক্ষমা চেয়েছেন - প্রায় দেড় মাস আগে। ওহ ভাল, আমি সফ্টওয়্যার পুরাতত্ত্ব করা বেশ অনেক সময় ব্যয়।

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

বিশ্লেষণ সঞ্চালনের আগে, আমি আপনার ইন্টারফেস stellar কম কম বলে যারা সাথে একমত হবে; যাইহোক, যদি আপনি মেমরি লিক / ট্রামপ্লিং বিষয়গুলির সাথে মোকাবিলা করেন এবং ডকুমেন্টটি 'মেমরি বরাদ্দ করা আবশ্যক' প্রয়োজন, তবে এটি 'OK' হতে পারে।

সমস্যা কি? ভাল, আপনি realloc() একটি বাফার পাস, এবং realloc() আপনি ব্যবহার করা উচিত এলাকার একটি নতুন পয়েন্টার আপনি ফেরৎ - এবং আপনি যে ফিরে মান উপেক্ষা। ফলস্বরূপ, realloc() সম্ভবত মূল মেমরি মুক্ত করা হয়েছে, এবং তারপর আপনি এটি একই পয়েন্টার পাস, এবং এটি অভিযোগ করে যে আপনি একই মেমরি দুইবার মুক্ত করছেন কারণ আপনি এটি মূল মান পাস আবার। এই শুধুমাত্র লিক মেমরি নয়, কিন্তু আপনি মূল স্থান ব্যবহার অব্যাহত যে মানে - এবং অন্ধকার পয়েন্ট মধ্যে জন ড্যুয়ের শট আউট যে আপনি realloc() এর অপব্যবহার করা হয়, কিন্তু গুরুতরভাবে আপনি কি করছেন তা জোর করা হয় না। এছাড়াও একটি অফ-বাই-এক ত্রুটি রয়েছে কারণ আপনি NUL '\ 0' এর জন্য যথেষ্ট স্থান বরাদ্দ করেন না যা স্ট্রিংটি বন্ধ করে দেয়।

মেমরি লিকটি ঘটে কারণ আপনি স্ট্রিংের শেষ মান সম্পর্কে কলারকে বলার জন্য একটি যন্ত্র প্রদান করেন না। যেহেতু আপনি মূল স্ট্রিং এর উপরে ত্র "টি রেখে দিয়েছিলেন তবে এটির পরে স্থানটি প্রদর্শিত হবে, কোডটি কাজ করার মত দেখায়, কিন্তু যদি আপনার কলিং কোডটি স্থান মুক্ত করে দেয়, তাহলে এটিও একটি ডাবল ফ্রি ডিক্রেশন পাবে, অথবা এটি একটি কোর ডাম্প বা সমমানের কারণ হতে পারে মেমরি নিয়ন্ত্রণ তথ্য সম্পূর্ণরূপে scrambled হয়।

আপনার কোডটি অনির্দিষ্ট বৃদ্ধি থেকেও রক্ষা করে না - 'নোয়েল' এর পরিবর্তে 'জয়উইক নোয়েল' এর পরিবর্তে বিবেচনা করুন। প্রত্যেক সময়, আপনি 7 অক্ষর যোগ করবেন, তবে প্রতিস্থাপিত টেক্সটে আপনি অন্য নেলকে খুঁজে পাবেন, এবং তা প্রসারিত করুন, এবং তাই এবং আরও অনেক কিছু। আমার ফিক্সড (নীচের) এই সমস্যাটি সমাধান করে না - সহজ সমাধান সম্ভবত অনুসন্ধান স্ট্রিং প্রতিস্থাপিত স্ট্রিং প্রদর্শিত কিনা; বিকল্পটি প্রতিস্থাপন স্ট্রিংটি বাদ দিয়ে অনুসন্ধানটি চালিয়ে যেতে হবে। দ্বিতীয় ঠিকানা আছে কিছু অ তুচ্ছ কোডিং বিষয়।

সুতরাং, আপনার বলা ফাংশন আমার প্রস্তাবিত পুনর্বিবেচনা হল:

char *strrep(char *input, char *search, char *replace) {
    int searchLen = strlen(search);
    int replaceLen = strlen(replace);
    int delta = replaceLen - searchLen;
    char *find = input;

    while ((find = strstr(find, search)) != 0) {
        if (delta > 0) {
            input = realloc(input, strlen(input) + delta + 1);
            find = strstr(input, search);            
        }

        memmove(find + replaceLen, find + searchLen, strlen(input) + 1 - (find - input));
        memmove(find, replace, replaceLen);
    }

    return(input);
}

এই কোডটি মেমরি বরাদ্দকরণ ত্রুটি সনাক্ত করে না - এবং সম্ভবত ক্র্যাশ (কিন্তু যদি না, লিক্স মেমরি না) যদি realloc() ব্যর্থ হয়। মেমরি ম্যানেজমেন্ট বিষয়গুলির একটি ব্যাপক আলোচনা জন্য স্টিভ Maguire এর 'লেখা কঠিন কোড' বই দেখুন।

0
যোগ
ধন্যবাদ, আমি কি ভুল করছিলাম তা সত্যিই একটি ভাল বিশ্লেষণ (এবং যে দ্বিগুণ একটি অর্থে একটি ভুল ছিল আমি বিভিন্ন জিনিস দ্বারা একটি উপ পণ্য ছিল।) আমি মনে করি আমি আমার মাথা এটি ছিল যে realloc ( ) শুধু মেমরি বরাদ্দ প্রসারিত - যা কোন অর্থে তোলে, যখন আমি এটি সম্পর্কে চিন্তা!
যোগ লেখক Matthew Schinckel, উৎস

realloc অদ্ভুত, জটিল এবং শুধুমাত্র প্রতি সেকেন্ডে প্রচুর পরিমাণে মেমরি সঙ্গে আচরণ যখন ব্যবহার করা উচিত। যেমন - এটি আসলে আপনার কোডকে দ্রুততর করে তোলে।

আমি কোড যেখানে দেখেছি

realloc(bytes, smallerSize);

ব্যবহার করা হয় এবং এটি ছোট করে, বাফার পুনরায় আকারে কাজ করে। প্রায় এক মিলিয়ন বার কাজ করে, তারপর কিছু কারণে realloc সিদ্ধান্ত নিয়েছে যে এমনকি যদি আপনি বাফার ছোট ছিল, এটি আপনাকে একটি সুন্দর নতুন অনুলিপি দিতে হবে। তাই আপনি একটি র্যান্ডম স্থান দুর্ঘটনা 1/2 খারাপ পর পর দ্বিতীয় একটি ঘটনা।

সর্বদা realloc এর রিটার্ন মান ব্যবহার করুন

0
যোগ

শুধু অন্ধকারে একটি শট কারণ আমি এটি এখনও চেষ্টা করেনি কিন্তু যখন আপনি realloc এটি পয়েন্টার অনেক malloc মত ফিরে। যেহেতু realloc যদি প্রয়োজন হয় পয়েন্টারটিকে সরানো যায় তবে আপনি যদি নিম্নলিখিত নির্দেশ না করেন তবে বেশিরভাগই একটি অবৈধ পয়েন্টারের কাজ করছেন:

input = realloc(input, strlen(input) + delta);
0
যোগ
এবং realloc ব্যর্থ হলে, এটি নুল ফেরৎ, এবং একা বিদ্যমান বাফার ছেড়ে। আপনি শুধু পয়েন্টার হারিয়েছেন ... :-(
যোগ লেখক Roger Lipscombe, উৎস

প্রথম বন্ধ, দুঃখিত আমি দলের দেরী করছি। এটি আমার প্রথম স্ট্যাকওভারফ্লো উত্তর। :)

হিসাবে উল্লেখ করা হয়েছে, যখন realloc() বলা হয়, আপনি সম্ভাব্য পয়েন্টার পুনর্বিবেচনার মেমরি পরিবর্তন করতে পারেন। যখন এটি ঘটবে, যুক্তি "স্ট্রিং" অবৈধ হয়ে যাবে এমনকি যদি আপনি এটি পুনঃনির্ধারণ করেন, ফাংশন শেষ হয়ে গেলে পরিবর্তনটি সুযোগের বাইরে যায়।

OP- র উত্তর দেওয়ার জন্য, realloc() নতুন-পুনর্বিন্যাসিত মেমরিতে একটি পয়েন্টার ফেরত পাঠায়। প্রত্যাবর্তন মান কোথাও সংরক্ষণ করা প্রয়োজন। সাধারণত, আপনি এটি করবেন:

data *foo = malloc(SIZE * sizeof(data));
data *bar = realloc(foo, NEWSIZE * sizeof(data));

/* Test bar for safety before blowing away foo */
if (bar != NULL)
{
   foo = bar;
   bar = NULL;
}
else
{
   fprintf(stderr, "Crap. Memory error.\n");
   free(foo);
   exit(-1);
}

TyBoer হিসাবে পয়েন্ট আউট, আপনি না এই ফাংশন ইনপুট হিসাবে পয়েন্টার পাশ করা হচ্ছে মান পরিবর্তন করা যাবে না। আপনি যা চান তা নির্দিষ্ট করতে পারেন, তবে ফাংশনের শেষে পরিবর্তনটি বেরিয়ে যাবে। নিম্নলিখিত ব্লকটিতে, "ইনপুট" ফাংশনটি সম্পন্ন হওয়ার পরেই একটি অবৈধ পয়েন্টার হতে পারে বা নাও হতে পারে:

void foobar(char *input, int newlength)
{
   /* Here, I ignore my own advice to save space. Check your return values! */
   input = realloc(input, newlength * sizeof(char));
}

মার্ক ফাংশনের আউটপুট হিসাবে নতুন পয়েন্টার ফেরত দিয়ে এটির কাজ করার চেষ্টা করে। আপনি যদি তা করেন, তাহলে কলারের দায়িত্ব হল যে তিনি ইনপুটের জন্য ব্যবহৃত পয়েন্টারটি ব্যবহার করবেন না। যদি এটি ফেরত মান সাথে মেলে, তাহলে আপনার একই পয়েন্টে দুটি পয়েন্টার থাকে এবং শুধুমাত্র তাদের একটিতে বিনামূল্যে কল করতে হবে ()। যদি তারা মিলিত না হয়, তবে ইনপুট পয়েন্টার এখন মেমরির দিকে ইঙ্গিত করে যে প্রক্রিয়াটির মালিকানাধীন বা হতে পারে না। এটি মুছে ফেলা একটি সেগমেন্টেশন ফল্ট হতে পারে

আপনি ইনপুট জন্য একটি ডবল পয়েন্টার ব্যবহার করতে পারে, এই মত:

void foobar(char **input, int newlength)
{
   *input = realloc(*input, newlength * sizeof(char));
}

যদি কলারের ইনপুট পয়েন্টারের একটি ডুপ্লিকেট কোথাও থাকে তবে এটির অনুলিপি এখনও অবৈধ হতে পারে।

আমি এখানে পরিষ্কার সমাধান ফাংশন কলকারী এর ইনপুট সংশোধন করার চেষ্টা করার সময় realloc() ব্যবহার করে এড়ানোর জন্য মনে হয়। শুধু malloc() একটি নতুন বাফার, যে ফিরে আসুন, এবং পুরানো পাঠ্য মুক্ত করতে হবে কিনা না কলার সিদ্ধান্ত নিতে। এই কলার মূল স্ট্রিং রাখা অতিরিক্ত সুবিধা আছে!

0
যোগ