मैं सी में काम कर रहा हूं (सी ++ नहीं)

मेरे पास निम्न कोड है (प्रश्न के उद्देश्य के लिए सरलीकृत):

const unsigned char val[2][4] = 
{
    { 1, 2, 3, 4 },
    { 5, 6, 7, 8 },
};
const unsigned char** container[2] = 
{ 
    val,
    val
};

print(container[0][0][0]);

मेरी अपेक्षा यह है कि यह 1 प्रिंट करेगा, लेकिन ऐसा नहीं है (यह 0 प्रिंट करता है लेकिन मुझे लगता है कि उस स्मृति पते पर ऐसा ही होता है)।

मुझे उम्मीद है कि यह print(container[0][1][2]); 7 प्रिंट करेगा। यह भी नहीं है।

मेरा इरादा कहीं न कहीं 2D सरणियों के एक समूह को परिभाषित करना है, और फिर उन सभी 2D सरणियों के किसी भी सरणी को कहीं और एक्सेस करने के लिए संग्रहीत करना है।

c
-1
Goose 30 सितंबर 2020, 09:37

2 जवाब

सबसे बढ़िया उत्तर
#include <stdio.h>

const unsigned char val[2][4] = 
{
    { 1, 2, 3, 4 },
    { 5, 6, 7, 8 },
};
const unsigned char** container[1] = { val };

int main(void) {
    printf("%d\n", container[0][0][0]);
}

तथा

% gcc val.c      
val.c:8:40: warning: initialization of ‘const unsigned char **’ from incompatible pointer type ‘const unsigned char (*)[4]’ [-Wincompatible-pointer-types]
    8 | const unsigned char** container[1] = { val };
      |                                        ^~~
val.c:8:40: note: (near initialization for ‘container[0]’)

तथा

% ./a.out        
[1]    228086 segmentation fault (core dumped)  ./a.out

एक सरणी नाम जो मूल्य रूपांतरण से गुजरता है वह प्रथम तत्व का सूचक बन जाता है। val का पहला तत्व val[0] है, इसका सूचक &val[0] है और इसका प्रकार const unsigned char (*)[4] है। एक द्वि-आयामी सरणी विशेष रूप से दोहरे-अप्रत्यक्ष सूचक के लिए क्षय नहीं होती है।

container के लिए सही घोषणा होती (यहाँ ३ के लिए, उदाहरण देने के लिए १ पॉइंटर्स नहीं:

const unsigned char (*container[3])[4] = { val, val, val };

यदि संदेह है तो आप cdecl.


ज्यादातर समय यह सरल हो सकता है

#include <stdio.h>

const unsigned char val[2][4] = 
{
    { 1, 2, 3, 4 },
    { 5, 6, 7, 8 },
};

const unsigned char (*container)[4] = val;

int main(void) {
    printf("%d\n", container[0][0]);
}
1
Antti Haapala 30 सितंबर 2020, 10:00
const unsigned char** container[1]

आपको "पॉइंटर्स टू पॉइंटर टू अहस्ताक्षरित" की एक सरणी (सिर्फ एक तत्व के साथ) देगा।

सरणी अनुक्रमण के साथ "पॉइंटर टू पॉइंटर टू अहस्ताक्षरित" का उपयोग नहीं किया जा सकता क्योंकि सरणी आयाम ज्ञात नहीं है जब आपके पास केवल ऐसा पॉइंटर होता है।

आप जो चाहते हैं वह शायद है:

const unsigned char (*container)[4] =  val;

यह containter को 4 अहस्ताक्षरित सरणी के लिए एक सूचक बनाता है। अब आंतरिक आयाम ज्ञात है ताकि आप सरणी अनुक्रमण का उपयोग कर सकें जैसे:

printf("%d\n", container[0][0]);
printf("%d\n", container[1][2]);

संपादित करें

यदि आप वास्तव में इनमें से एक सरणी चाहते हैं, तो आप यह कर सकते हैं:

const unsigned char valA[2][4] = 
{
    { 1, 2, 3, 4 },
    { 5, 6, 7, 8 },
};

const unsigned char valB[2][4] = 
{
    { 11, 12, 13, 14 },
    { 15, 16, 17, 18 },
};

const unsigned char (*container[2])[4] =  {valA, valB};

printf("%d\n", container[0][0][0]);
printf("%d\n", container[0][1][2]);
printf("%d\n", container[1][0][0]);
printf("%d\n", container[1][1][2]);
2
4386427 30 सितंबर 2020, 10:11