C/Visual C - Crear arreglo dinamico de uint64_t

 
Vista:
sin imagen de perfil

Crear arreglo dinamico de uint64_t

Publicado por Diego (150 intervenciones) el 29/09/2016 23:59:59
BUenas tardes estuve intentando crear un arreglo con que vaya aumentando en 1 su tamaño a medida que se ingresan los numeros. pero cometo "Violación de segmento (`core' generado)", asi que algo estoy haciendo mal con el uso de los punteros.

COdigo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <endian.h>
#include <inttypes.h>
void add_number(uint64_t **array, uint64_t number, uint64_t size);
int main(int argc, char *argv[]){
	uint64_t num;
	uint64_t *array = NULL;
	uint64_t i;
//	array = (uint64_t *)malloc(sizeof(uint64_t) * 1);
	for (i = 0; i<4; i++){
		scanf("%" SCNu64, &num);
		add_number(&array, num, i);
	}
	for (i = 0; i<4	; i++){
		printf("num = %" PRId64 "\n", *(array + i));
	}
	return EXIT_SUCCESS;
}
void add_number(uint64_t **array, uint64_t num, uint64_t size)
{
//	printf("Direccion = %p\n", &(*array));
	*array = (uint64_t *) realloc(*array, (size + 1));
	**(array + size) = num;
	printf("num = %" PRId64 "\n", **(array + size));
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Crear arreglo dinamico de uint64_t

Publicado por Tom (619 intervenciones) el 30/09/2016 09:39:07
No estás calculando bien el tamaño del array ... y además yo te recomendaría usar otra sintaxis ...

Prueba esto:

1
2
3
4
5
6
7
void add_number(uint64_t **array, uint64_t num, uint64_t size) {
	*array = (uint64_t *)realloc(*array, (size + 1) * sizeof(uint64_t));
 
	(*array)[size] = num;
 
	printf("num = %" PRId64 "\n", (*array)[size]);
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar

Crear arreglo dinamico de uint64_t

Publicado por chema (234 intervenciones) el 30/09/2016 12:08:43
Suena a broma el invento , además esa función void que no devuelve el puntero de realloc es muy "sinpatica" y traicionera, el Puntero original después de un realloc se puede "perder".
¿Tiene algún sentido realizar un reallloc por cada nuevo elemento?
Para evitar ese tipo de situaciones dispones de listas enlazadas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Crear arreglo dinamico de uint64_t

Publicado por Chema (234 intervenciones) el 30/09/2016 15:23:08
1. realloc can leave stale pointers
If you have references to structures allocated by malloc, these references can now be bogus since realloc is free to move where it reallocates your memory. In other words, it can do the equivalent of a malloc, memcpy of your data to a new location then it frees your old memory. So your pointers to that object are now pointing into garbage. This can also lead to a security bug.

http://www.iso-9899.info/wiki/Why_not_realloc
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Crear arreglo dinamico de uint64_t

Publicado por Diego (150 intervenciones) el 30/09/2016 17:04:58
Es una función de prueba para la función que tengo que desarrollar.
Y usé realloc porque a priori no se cuantos elementos van a ser agregados(aunque el ejemplo diga lo contrario).
Es más facil hacerlo con listas enlazadas. Pero ayer no me acordaba como usar una lista enlazada. Hoy si me acuerdo, pero ayer no me entraba nada a la cabeza, aunque lo leyera.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Crear arreglo dinamico de uint64_t

Publicado por Diego (150 intervenciones) el 01/10/2016 02:57:54
Gracias, se arregló el problema y no conocía esa sintaxis.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar