Witam,
Mam problem z moim programem który w jednej strukturze MY_ARRAY przechowuje dane typu void*. Podczas wywołania programu podczas wyprowadzania danych to konsoli dostaję naruszenie dostępu pamięci w ostatniego elementu który chcę wydrukować i wyskakuje mi to powiadomienie przy funkcji printPoint. Nie wiem co tu może być nie tak z góry dzięki za pomoc.
data.h
typedef struct MY_POINT {
double x, y;
char* name;
}Point;
Point* initPoint(double a, double b, char* pointName);
void printPoint(void* ptr);
void freePoint(void* ptr);
data.cpp
#include "my_data.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#pragma warning (disable : 4996)
Point* initPoint(double a, double b, char* pointName){
int len = strlen(pointName) + 1;
Point* ptr = (Point*)malloc(sizeof(Point));
if (!ptr)
return NULL;
ptr->name = (char*)malloc(len* sizeof(char));
if (!ptr->name) {
printf("Allocation error for name\n");
return NULL;
}
memset(ptr->name, 0, len * sizeof(char));
strcpy(ptr->name, pointName);
//ptr->name[len] = '\n';
ptr->x = a;
ptr->y = b;
return ptr;
}
void printPoint(void* ptr) {
Point* tmp = (Point*)ptr;
printf("Title: %s\nx= %lf, y=%lf\n", tmp->name, tmp->x, tmp->y);
}
void freePoint(void* ptr){
Point* tmp = (Point*)ptr;
if (tmp) {
if (tmp->name)
free(tmp->name);
tmp->name = NULL;
free(tmp);
}
tmp = NULL;
}
tab.h
#pragma once
typedef void (*PtrPrint)(void* data);
typedef void (*FreePtr)(void* ptr);
typedef struct MY_TAB {
void* data;
static size_t availablePosition;
}Array;
Array* initContainer(int dim, FreePtr fptr, PtrPrint pptr);
int addToContainer(Array* ptr, void* data);
void printContainer(Array* ptr);
void freeContainer(Array* ptr);
tab.cpp
#include "my_tab.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
size_t Array::availablePosition = 0;
FreePtr freeFunc;
PtrPrint printFunc;
Array* initContainer(int dim, FreePtr fptr, PtrPrint pptr){
Array* newptr = (Array*)malloc(dim * sizeof(Array));
if (!newptr) {
printf("Container allocation error\n");
return NULL;
}
memset((void*)newptr, 0, dim * sizeof(Array));
freeFunc = fptr;
printFunc = pptr;
Array::availablePosition = 0;
return newptr;
}
int addToContainer(Array* ptr, void* pdata){
size_t len = _msize(ptr) / sizeof(Array);
//printf("Len from add to container: %d\n", len);
//printf("Available position from add to container: %zu\n", Array::availablePosition);
if (Array::availablePosition >= len) {
ptr = (Array*)realloc(ptr, len * 2 * sizeof(Array));
if (!ptr)
return 0;
}
ptr[Array::availablePosition].data = pdata;
++Array::availablePosition;
return 1;
}
void printContainer(Array* ptr){
size_t i;
//printf("Array len= %zu\n", Array::availablePosition);
for (i = 0; i <= Array::availablePosition; i++)
printFunc(ptr[i].data);
}
void freeContainer(Array* ptr){
if (ptr) {
for (size_t i = 0; i < Array::availablePosition; i++)
freeFunc(ptr[i].data);
Array::availablePosition = 0;
free(ptr);
}
ptr = NULL;
}
main.cpp
#include <stdio.h>
#include "my_data.h"
#include "my_tab.h"
int main(void) {
Point* t = initPoint(2.34, 4.67, (char*)"Asdasd");
Point* t2 = initPoint(6.98, 123.45, (char*)"Bsada");
Point* t3 = initPoint(34.98, 13.45, (char*)"Cdaas");
Array* tab = initContainer(2, freePoint, printPoint);
addToContainer(tab, t);
addToContainer(tab, t2);
addToContainer(tab, t3);
printContainer(tab);
freeContainer(tab);
//printPoint(t);
//printPoint(t2);
return 0;
}