इस सेक्शन में हम देखेंगे कि C++ में memset() फ़ंक्शन का उद्देश्य क्या है। यह फ़ंक्शन एक कैरेक्टर के मान को अनसाइन्ड कैरेक्टर में बदलता है और इसे दिए गए str[] द्वारा इंगित ऑब्जेक्ट के पहले n कैरेक्टर्स में से प्रत्येक में कॉपी करता है। यदि n स्ट्रिंग साइज़ से बड़ा है, तो व्यवहार अनडिफाइंड होगा।
memset() फ़ंक्शन का सिंटैक्स
void* memset(void* str, int c, size_t n);
इस उदाहरण में हम एक स्ट्रिंग का उपयोग करेंगे, फिर प्रत्येक कैरेक्टर को लंबाई n तक किसी अन्य कैरेक्टर में बदलेंगे।
उदाहरण 1: स्ट्रिंग पर memset
#include <bits/stdc++.h>
using namespace std;
int main() {
char str[] = "Hello World";
memset(str, 'o', 6); // n = 6 लें
cout << str;
}
आउटपुट
ooooooWorld
उदाहरण 2: ऐरे को 0 और -1 से भरना
memset() का उपयोग सभी मानों को 0 या -1 पर सेट करने के लिए किया जा सकता है। लेकिन हम अन्य मानों का उपयोग नहीं कर सकते, क्योंकि memset() बाइट दर बाइट काम करता है।
#include <bits/stdc++.h>
using namespace std;
int main() {
int array[10];
// 0 से भरें
memset(array, 0, sizeof(array));
for(int i = 0; i < 10; i++) {
cout << array[i] << " ";
}
cout << endl;
// -1 से भरें (सभी बिट्स 1 हो जाते हैं)
memset(array, -1, sizeof(array));
for(int i = 0; i < 10; i++) {
cout << array[i] << " ";
}
cout << endl;
// 3 से भरें - गलत परिणाम!
memset(array, 3, sizeof(array));
for(int i = 0; i < 10; i++) {
cout << array[i] << " ";
}
cout << endl;
}
आउटपुट
0 0 0 0 0 0 0 0 0 0
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1
50529027 50529027 50529027 50529027 50529027 50529027 50529027 50529027 50529027 50529027
क्यों 3 काम नहीं करता?
memsetप्रत्येक बाइट को मान 3 (0x03) पर सेट करता है- int आमतौर पर 4 बाइट्स का होता है: 0x03030303 = 50,529,027 (डेसीमल)
- यही कारण है कि केवल 0 (0x00) और -1 (0xFF) सही काम करते हैं
सही विकल्प
// ऐरे को किसी मान से भरने के लिए
#include
fill(begin(array), end(array), 3); // सही तरीका
// या C++20 में
ranges::fill(array, 3);
// वेक्टर के लिए
vector v(10, 3); // कंस्ट्रक्टर में ही मान दें
सावधानियां
- केवल POD (Plain Old Data) टाइप्स के लिए उपयोग करें
- क्लास ऑब्जेक्ट्स, std::string, वेक्टर आदि पर नहीं उपयोग करें
- वर्चुअल फ़ंक्शन वाले ऑब्जेक्ट्स पर उपयोग करने से वीटेबल पॉइंटर करप्ट हो जाएगा