मैं किसी फ़ंक्शन में किसी सरणी के तत्वों को संशोधित करने का प्रयास कर रहा हूं। जब मुख्य में रखा जाता है तो यह ठीक काम करता है लेकिन जब मैं इसे किसी फ़ंक्शन में पोर्ट करता हूं तो यह सरणी के पहले सदस्य तक पहुंचने के बाद अलग हो जाता है।

नीचे दिए गए कोड को दिखाने के लिए मेरे वास्तविक कोड का सिर्फ एक छोटा संस्करण है जहां मुझे segfault मिल रहा है।

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

typedef struct {
    unsigned short id;
} voter;

void initialise(voter** votersPtr, unsigned short *numOfVoters) {
    *votersPtr = malloc(sizeof(voter)*(*numOfVoters));

    for(int i = 0; i < *numOfVoters; i++) {
        votersPtr[i]->id = (unsigned short) i;
        printf("%hu \n", votersPtr[i]->id);
    }
}

int main(void) {
    unsigned short numOfVoters = 480;
    voter* voters = NULL;

    initialise(&voters, &numOfVoters);

    return EXIT_SUCCESS;
}

किसी भी मदद की बहुत सराहना की जाएगी, धन्यवाद।

2
User 25 नवम्बर 2015, 00:17

3 जवाब

सबसे बढ़िया उत्तर

टाइप voter ** अस्पष्ट या तो एक पॉइंटर से व्यूअर की एक सरणी के लिए voter ऑब्जेक्ट्स या पॉइंटर से पॉइंटर voter ऑब्जेक्ट की सरणी में है। । आपका कोड इसे पहले के रूप में उपयोग कर रहा है, लेकिन इसे दूसरे के रूप में उपयोग करना चाहिए। परिवर्तन

votersPtr[i]->id = ...

सेवा

(*votersPtr)[i].id = ...

और सब कुछ काम करना चाहिए।

0
zwol 24 नवम्बर 2015, 21:23

votersPtr[i]->id, जो (*votersPtr[i]).id के समान है (*votersPtr)[i].id होना चाहिए।

2
mch 24 नवम्बर 2015, 21:21

याद रखें कि votersPtr किसी व्यूअर के पॉइंटर का पॉइंटर है।

तो निम्न पंक्ति नहीं होनी चाहिए:

votersPtr[i]->id = (unsigned short) i;

इसके बजाय:

(*votersPtr)[i].id = (unsigned short) i;
0
Jonathan Wood 24 नवम्बर 2015, 21:24