jimbakl Δημοσ. 23 Απριλίου 2012 Δημοσ. 23 Απριλίου 2012 καλημέρα. Φτιάχνω το μέχρι στιγμής μεγαλύτερό μου πρόγραμμα. Για Ν=5 (πελάτες, -->Ν*Ν πίνακες, κτλ..) δουλεύει μια χαρά. Πρέπει όμως τώρα να κάνω ένα validation για Ν<=100 . Στο πρόγραμμα δουλεύω σχεδόν μόνο με pointers και δέσμευσης δυναμικά μνήμης. Όταν λοιπόν φτάνει το Ν=9 χτυπάει αυτό το σφάλμα. > Windows has triggered a breakpoint in validation_routine_RCSPP.exe. This may be due to a corruption of the heap, which indicates a bug in validation_routine_RCSPP.exe or any of the DLLs it has loaded. This may also be due to the user pressing F12 while validation_routine_RCSPP.exe has focus. και μετά κάνοντας continue anti gia break σταματάει σε μία αρχικοποίηση πίνακα 1*Ν , τον οποίον τον έχω δηλώσει : > int *tempPath tempPath=( int * )calloc(N, sizeof( int )); if (tempPath == NULL) printf("\nError\n"); και μου εκτιπώνει αυτό το error. Το δοκίμασα και με malloc το ίδιο όμως. Είμαι καινούργιος στην χρήση δεικτών, λογικά κάτι απλό θα είναι αλλά δεν το ξέρω. Τον πίνακα tempPath τον δουλεύω σε κάθε Ν, μήπως πρέπει να βάλω την εντολή free(), αν και δεν ξέρω τι ακριβώς κάνει; το δοκίμασα και αυτό αλλά μπορεί να μην την έβαλα στο σωστόσημείο ή να χρειάζεται και κάτι άλλο.... Κάτι άλλο: στο σημείο που αρχίζει να χτυπάει μου ανοίγει το "dbgcalloc.c" >/*** *dbgcalloc.c - Debug CRT Heap Function of calloc() * * Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: * Defines debug versions of heap functions calloc(). * *******************************************************************************/ #ifdef _DEBUG #include <windows.h> #include <winheap.h> #include <ctype.h> #include <dbgint.h> #include <crtdbg.h> #include <rtcsup.h> #include <internal.h> #include <limits.h> #include <malloc.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <locale.h> #include <mtdll.h> #include <setlocal.h> #pragma warning(disable:4390) /*** *void * calloc() - Get a block of memory from the debug heap, init to 0 * *Purpose: * Allocate of block of memory of at least size bytes from the debug * heap and return a pointer to it. * * Allocates 'normal' memory block. * *Entry: * size_t nNum - number of elements in the array * size_t nSize - size of each element * *Exit: * Success: Pointer to (user portion of) memory block * Failure: NULL * *Exceptions: * *******************************************************************************/ extern "C" _CRTIMP void * __cdecl calloc( size_t nNum, size_t nSize ) { void *res = _calloc_dbg(nNum, nSize, _NORMAL_BLOCK, NULL, 0); RTCCALLBACK(_RTC_Allocate_hook, (res, nNum * nSize, 0)); return res; } #endif /* _DEBUG */ καμία ιδέα;;;...
migf1 Δημοσ. 23 Απριλίου 2012 Δημοσ. 23 Απριλίου 2012 Είναι σίγουρο πως το Ν έχει έγκυρη τιμή στο σημείο που κάνεις calloc() το tempPath; ΥΓ. Άσχετο, δεν χρειάζεται να κάνεις cast την calloc() EDIT: Επίσης άσχετο, οι 2 τελευταίες γραμμές μπορούν να συμπτυχθούν σε 2 χωρίς να χάσουν σημαντικά το ευανάγνωστο του κώδικα, ως εξής... > int *tempPath = NULL; if ( NULL == (tempPath = calloc(N, sizeof(int)) ) printf("\nError\n"); είναι συχνό και ασφαλές idiom... χρησιμοποιείται συχνά δηλαδή Και αφού είσαι στην αρχή, μην ορίζεις δείκτες χωρίς να τους αρχικοποιείς άμεσα. Στο συγκεκριμένο παράδειγμα είσαι οκ, γιατί τον tempPath τον κάνεις calloc() αμέσως, αλλά είναι (πολύ) καλό να το κάνεις συνήθεια να αρχικοποιείς τους δείκτες κατά τον ορισμό τους. Είτε σε NULL, είτε σε κάποια γνωστή διεύθυνση (είτε μεταβλητής, είτε με calloc()/malloc() ). Υπό αυτή την έννοια, θα μπορούσες να γράψεις τις παραπάνω γραμμές και ως εξής... > int *tempPath = calloc( N, sizeof(int) ); if ( !tempPath ) printf("\nError\n"); αλλά δεν είναι πάντα εφικτό (π.χ. αν το N δεν είναι γνωστό εξαρχής).
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα