Функция работает беспорядочно, перезаписывает память, дважды освобождает, коррупция (! Prev) - PullRequest
0 голосов
/ 13 апреля 2020

Я изучаю C программирование, и я думаю, что у меня все хорошо, но это я пытаюсь часами, и я не понимаю, что делаю неправильно. Я сделал функцию для печати массива, и она работает нормально, но только в первый раз, позже печать странного символа не работает, с gdb, который работает отлично, но когда я вызываю printArray во второй раз, функция integerToString не работает работает второй раз. Честно говоря, я не знаю, как это исправить, я прошу немного помочь, пожалуйста; -; Я прошу все, что вы прокомментируете

Следующий код является минимально воспроизводимым примером, но проблема, я думаю, заключается только в функции seeArray и функции integerToString

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

//Dependecy
int randomInRange(int lower, int upper){
    return (random() % (upper - lower + 1)) + lower;
}

//Dependecy
int countDigits(int num, int * numSize){
    *numSize = 0;
    do{
            (* numSize)++;
            num /= 10;
    }while(num != 0);

    return 0;
}

//Here is where things gets broke!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
int integerToString(int num, char** strNum, int* strNumSize){
    countDigits(num, strNumSize);
    *strNum = (char *) malloc(sizeof(char) * (*strNumSize));
    if(*strNum == 0x0){
            fprintf(stderr, "No enough memory for convert interger to string");
            exit(EXIT_FAILURE);
    }

    for(int i = (*strNumSize-1); i > -1; i--){
            *( (*strNum) + i ) = num%10 + '0';
            num /= 10;
    }
    return 0;
}
//Dependecy
int initArray(int** array, int size){
    if(size<1){
            fprintf(stderr, "The array\'s size most be minimun one");
            exit(EXIT_FAILURE);
    }
    *array = (int*) malloc(sizeof(int)*size);
    if(*array == NULL){
            fprintf(stderr, "Couldn\'t reserve memory for array");
            exit(EXIT_FAILURE);
    }
    for(int i = 0; i < size; i++) *((*array)+i) == 0;
    return 0;
}

//Here is where things gets broke!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
int seeArray(int* array, int size, char** arrayPhotography, int* arrayPhotographySize){
    int dataSize = 0;
    char* data = 0x0;

    for(int i = 0; i < size; i++){
            integerToString(*(array+i), &data, &dataSize);

            *arrayPhotographySize += sizeof(char) * ( 2 + dataSize );
            if(*arrayPhotography == 0x0){
                    *arrayPhotography = (char *) malloc(*arrayPhotographySize);
            }else{
                    *arrayPhotography = (char *) realloc(*arrayPhotography,*arrayPhotographySize);
            }
            if(*arrayPhotography == 0x0){
                    fprintf(stderr,"Not enoug memory for array\'s photography");
                    exit(EXIT_FAILURE);
            }

            strcat(*arrayPhotography, "[");
            strcat(*arrayPhotography, data);
            strcat(*arrayPhotography, "]");

            free(data);
            data = 0x0;
    }

    free(data);
    return 0;
}
//Dependecy
int printArray(int* array, int size){
    int arrayPhotographySize = 0;
    char* arrayPhotography = 0x0;
    if(seeArray(array, size, &arrayPhotography, &arrayPhotographySize)){
            fprintf(stderr, "Fuction printArray");
            exit(EXIT_FAILURE);
    }
    printf("Array:%s\n", arrayPhotography);
    free(arrayPhotography);
    return 0;
}
//Here is where things gets broke!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
int main(int argc, char * argv[]){
    srand(time(NULL));
    int arraySize = randomInRange(1, 15);
    int* array = 0x0;
    initArray(&array, arraySize);
    for (int i = 0; i < 10; i++){
        printArray(array, arraySize);
    }
    free(array);
}

Это изображение того, как работает случайным образом (я так думаю)

enter image description here

1 Ответ

2 голосов
/ 13 апреля 2020
  1. Похоже, что в вашей функции initArray в финале для l oop вы пишете == вместо = для заполнения нуля массива. Кроме того, в заголовке <stdlib.h> существует функция calloc, которая автоматически заполнит динамически распределенный массив нулями, что удобно для избежания простых ошибок, подобных этой.
  2. В вашем * Функция 1009 *, у вас всего malloc достаточно места для хранения количества цифр в строке. Однако этот код подвержен ошибкам, поскольку большинство строковых операций в C (включая strcat) требуют, чтобы строки заканчивались нулевым символом. Выделите место для одного дополнительного символа, а затем убедитесь, что последний символ равен 0.
...