Проблема с динамической памятью после realloc - C - PullRequest
1 голос
/ 19 марта 2011

Для выполнения задания в школе мы должны использовать структуры для создания матриц, которые могут хранить бесконечное количество баллов для бесконечного количества матриц.(теоретически бесконечно)

Для задания я решил использовать calloc и realloc.То, как идут размеры для матрицы: она удваивается в размере каждый раз, когда ее предел достигает своих точек (поэтому она начинается с 1, затем идет до 2, затем 4 и так далее).Он также удваивается по размеру каждый раз, когда добавляется матрица.

В этом моя проблема.После того, как начальная матрица добавлена, и она добавляет второе имя матрицы и точки, она дает мне следующее:

B???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

B - это та часть, которую я хочу (как я использую strcmp позже), но?знаки не должны быть там.(очевидно)

Я не уверен, почему именно это делает.Поскольку код является модульным, его части не очень легко показать, как именно это происходит.

Примечание: я могу получить доступ к точкам матрицы с помощью метода: MyMatrix[1].points[0].x_cord;(это только пример)

Пример кода, вызывающего проблему:

STRUCTS:

 struct matrice {
    char M_name[256];
    int num_points[128];
    int set_points[128];
    int hasValues[1];
    struct matrice_points * points;
} * MyMatrix;
struct matrice_points {
    int set[1];
    double cord_x;
    double cord_y;
};

Функция матрицы установки:

void setupMatrix(){

    MyMatrix = calloc(1, sizeof(*MyMatrix));
    numMatrix = 1;

}

GrowМатричная функция:

void growMatrix(){

    MyMatrix = realloc(MyMatrix, numMatrix * 2 * sizeof(*MyMatrix));
    numMatrix = numMatrix * 2;

}

Добавить матричную функцию, которая выводит эту проблему после однократного увеличения матрицы.

void addMatrix(char Name, int Location){

    int exists = 0;
    int existsLocation = 0;
    for (int i = 0; i < numMatrix; i++){
        if (strcmp(MyMatrix[i].M_name, &Name) == 0){
            exists = 1;
            existsLocation = i;
        }
    }

    *MyMatrix[Location].M_name = Name;
    printf("Stored Name: %s\n", MyMatrix[Location].M_name);
    *MyMatrix[Location].num_points = 1;
    *MyMatrix[Location].set_points = 0;
    *MyMatrix[Location].hasValues = 1;
    MyMatrix[Location].points = calloc(1, sizeof(*MyMatrix[Location].points));

}

Ответы [ 3 ]

0 голосов
/ 19 марта 2011
*MyMatrix[Location].M_name = Name;

Вы копируете здесь один символ, а не строку.Если вы хотите строку, Name должен быть определен как char *, и вы должны использовать strcpy.

0 голосов
/ 19 марта 2011
void addMatrix(char Name, int Location)

char Name представляет собой единственное char, то есть количество целочисленного типа. char это просто число, это вовсе не строка.

Когда вы делаете это:

strcmp(..., &Name)

вы предполагаете, что место, где хранится этот символ, представляет собой допустимую строку C. Это неправильно, нет никаких причин, почему это должно быть так. Если вы хотите передать строку C в эту функцию, вам нужно объявить ее следующим образом:

void addMatrix(char *Name, int Location)

Затем вам нужно скопировать эту строку C в соответствующее место в вашей матричной структуре. Это должно выглядеть так:

strncpy(... .M_name, Name, max_number_of_chars_you_can_store_in_M_Name);

Также эти определения полей странны в вашей структуре:

int num_points[128];
int set_points[128];
int hasValues[1];

Это означает, что ваша структура будет содержать массив из 128 int, называемых num_points, другой массив из 128 int, вызывающих set_points, и массив из одного int (странного), называемого hasValues. Если вам нужно только сохранить общее количество баллов и заданных баллов и флаг, указывающий, сохраняются ли значения, определение должно быть:

int num_points;
int set_points;
int hasValues;

и исправьте назначения в вашей функции addMatrix.

Если вам нужны эти массивы, то ваши назначения также неверны.

Пожалуйста, включите все предупреждения в вашем компиляторе.

0 голосов
/ 19 марта 2011

Попробуйте добавить '\ 0' в конец ваших данных.

...