Jump to content

C memcpy segmentation fault


cebro

Recommended Posts

Boas malta,

Estou com uma dificuldade em adicionar uma estrutura a um vetor (estrutura) através do memcpy e não estou a perceber o porquê. As estruturas estão definidas no vecloc.h bem como as funções e suas implementações num ficheiro .c, mas coloquei aqui para uma simplificação visual.

Talvez não esteja a perceber bem como aceder a diferentes estruturas através do vector vecloc->data, alguém me consegue dar alguma sugestão ou conteúdo ou mesmo explicar-me esta parte?

Desde já agradeço qualquer ajuda!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include "vecloc.h"
  
/*
typedef struct{ 
	int fileIdx; 
	int line; 
	long offset;
} Location; 
	
typedef struct{ 
	int space; 
	int count; 
	Location *data; 
} VecLoc; 
 * */

VecLoc *vlCreate( void )
{
	VecLoc* v = malloc(sizeof(VecLoc));
	
	if(v == NULL)
		return NULL;
		
	v->data = malloc(sizeof(Location));
	
	if(v->data == NULL)
	{
		free(v);
		return NULL;
	}
		
	v->space = 1;
	v->count = 0;
	v->data = NULL;
	
	return v;
}
  

Location* vector_get_dataPos(VecLoc* v, int pos)
{
	if(pos > v->count)
		return NULL;
	
	return v->data + pos * sizeof(Location);

}

int vlAdd( VecLoc *vec, Location *loc )
{	
	
	if(vector_has_space(vec) == false)
	{
		vec->data = realloc(vec->data, (vec->space + VECTOR_INCREMENT_DATA) * sizeof(Location));
		
		if(vec->data == NULL)
			return 0;
			
		vec->space += VECTOR_INCREMENT_DATA;
		
		printf("Vector Count is now %d\n", vec->count);

	}
	
	int newDataPos = vec->count ;
	
	
	Location* newData = vector_get_dataPos(vec, newDataPos);
	
	memcpy(newData, loc, sizeof(Location));
	
	vec->count++;
	
	return 1;	
	
}

int main()
{
	Location locToCopy;
	locToCopy.fileIdx = 1;
	locToCopy.line = 2;
	locToCopy.offset = 0;
	
	Location* locPtr = &locToCopy;
	
	//VecLoc *vlCreate( void );
	VecLoc* ptrVec = vlCreate();
	int x = vlAdd(ptrVec, locPtr);
	
	if(x)
	{
		printf("Vetor Space = %d\n", ptrVec->space);
		printf("Vetor Count = %d\n", ptrVec->count);
		printf("Vetor Location fileIDX = %d\n", ptrVec->data->fileIdx);
		printf("Vetor Location line = %d\n", ptrVec->data->line);
		printf("Vetor Location offset = %d\n",(int) ptrVec->data->offset);
	}
	
	return 0;
}

 

Link to comment
Share on other sites

Em 30/12/2022 às 12:56, cebro disse:

Peço desculpa pela criação talvez desnecessária do tópico, se puderem fechem/apaguem.

Não tens de pedir desculpa, tinhas uma dúvida e vieste pedir ajuda, é para isso que cá estamos.

Os tópicos no P@P não são encerrados a não ser que violem as Regras do Fórum. Uma vez que nenhuma regra foi infringida, o tópico manter-se-á público.

Qualquer dúvida que venhas a ter, dispõe, estamos cá para isso 😉

Cumprimentos.

Knowledge is free!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.