c - 随机选择名字时出现奇怪的字符

标签 c arrays struct

我有以下代码:

#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/

相关文章:

c - 打印双指针字符数组时出现运行时错误

python - 从 C 代码序列化数组数据,在 Python 中反序列化

android - listview 成功运行,但在模拟器中没有任何显示

java - 如何将这些整数传递给下面的方法?

c - struct - 使用 sizeof() 的最佳方法

c - 目标文件到二进制代码

mysql - Eclipse CDT MySql 未知类型名称 ‘ulong’

go - 如何在 golang slice 中搜索元素

javascript - 如何在 javascript 中将提交的测验答案数组与正确答案数组进行比较

可以将地址运算符应用于非整数类型的二维数组和 C 中结构的非整数字段吗?