我有以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct persona
{
char *nombre;
int edad;
int sexo;
} Persona;
typedef struct
{
int size;
Persona vecPersona[];
} Array;
Array* getArrayInstance()
{
Array *vec;
vec = (Array*) malloc (sizeof(Persona));
vec->size = 0;
return vec;
}
void push_back(Array ** vec, Persona tipito)
{
(*vec)->vecPersona[(*vec)->size] = tipito;
(*vec)->size++;
printf("%d-", (*vec)->size);
int newSize = (*vec)->size*2-(*vec)->size+1;
Array *tmp = realloc((*vec), newSize*sizeof(Persona));
if(tmp)
*vec = tmp;
else
(*vec)->size--;
}
void mostrarPersonas(Array *vec)
{
int i;
printf("\n\n");
printf("%d", vec->size);
for(i=0; i<vec->size; i++)
{
printf("(%d) Nombre: %s - Edad: %d - Sexo: ", i, vec->vecPersona[i].nombre, vec->vecPersona[i].edad);
if(vec->vecPersona[i].sexo == 0)
printf("Masculino");
else
printf("Femenino");
printf("\n");
}
}
void cargarPersonas(Array **vec)
{
int i, edad, random;
int cantPersonas = 3;
Persona aux;
char hombres[][20] = {"Ramiro","Pedro","Federico","Jose","Antonio","Pablo","Raul","Gustavo","Gonzalo","Airton"};
char mujeres[][20] = {"Mariana","Jennifer","Luz","Roxana","Ana","Sol","Micaela","Romina","Melina","Camila"};
for(i=0; i<cantPersonas; i++)
{
edad = rand()%80+1;
aux.edad = edad;
if( (random = rand()%10) %2 == 0)
{
aux.nombre = hombres[random];
aux.sexo = 0;
}
else
{
aux.nombre = mujeres[random];
aux.sexo = 1;
}
push_back(vec, aux);
}
}
int main()
{
srand(time(NULL));
Array *vecPersonas = getArrayInstance();
cargarPersonas(&vecPersonas);
printf("%d", vecPersonas->size);
mostrarPersonas(vecPersonas);
return 0;
}
代码编译没有错误,但是当我执行它时却给我带来了问题。例如,我在名称字段中收到奇怪的字符。
示例输出:
<0> Nombre: ?ç!:. - Edad: 25 - Sexo: Maculino
更新
显然问题出在函数push_back
void push_back(Array ** vec, Persona tipito)
{
(*vec)->vecPersona[(*vec)->size] = tipito;
(*vec)->size++;
int newSize = (*vec)->size + 1;
Array *tmp = realloc(*vec, (newSize*sizeof(Persona))); // here
if (!tmp)
{
printf("Cannot allocate more memory.\n");
(*vec)->size--;
}
else
*vec = tmp;
}
最佳答案
第一个错误:
Array* getArrayInstance()
{
Array *vec;
vec = (Array*) malloc (sizeof(Persona));
// ^^^^^^^^^
// should be sizeof(*vec) == sizeof(Array)
vec->size = 0;
return vec;
}
第二个错误:
void push_back(Array ** vec, Persona tipito)
{
(*vec)->vecPersona[(*vec)->size] = tipito;
// ^^^^^^
// access out of range
// the last object in array is indexed with size-1
// if you wanted the first object, which is indexed with 0
// then it is still wrong as your vec->size is 0 when there
// is no memory allocated for the array
标准输出中的
奇怪字符 是 UB 的先知或者更准确地说,是对我们维度的转换。
作为程序员,我们应该不惜一切代价避免在输出中出现奇怪的字符。每当您看到他们立即采取行动纠正错误程序时,请特别注意与访问数组元素相关的代码行,但不限于此。
关于c - 随机选择名字时出现奇怪的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32278930/