Структура массивов с указателем - PullRequest
0 голосов
/ 10 декабря 2018

Я изучаю, что CI написал код, и ошибка "передача аргумента 1 из 'strcpy' делает указатель из целого числа без приведения".

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct humans{
    sname[20];
}human;


int main(){
    human *person=(human *)malloc(sizeof(human)*1);

    int i,k,z;
    for(i=0;i<5;i++){
        person=(human *)realloc(person,sizeof(human)*(i+1));
        strcpy(*person[i].sname , "john");
    }


    for(i=0;i<5;i++){
    printf("%s",*person[i].sname);
    }
    return 0;
}

Я хочу использовать malloc / realloc.

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Я исправил прямые проблемы в вашей программе.Более глубокий момент здесь заключается в том, как добраться до нужного указателя.

array[4] получает значение 4-го элемента.array получает указатель на первый элемент &array[4] получает указатель на 4-й элемент array + 4 получает указатель на 4-й элемент *(array + 4) получает значение 4-го элемента *array[4] получает значение, обрабатывает его какуказатель и пытается получить значение из цели указателей - это потребует дополнительных усилий, чтобы убедить компилятор, какой это будет тип.В большинстве случаев это, вероятно, бессмысленно.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct humans {
    char sname[20];
}human;


void MyStrCpy(char * dst, int dst_n, char * src, int src_n)
{
    for (int n = 0; n < dst_n && n < src_n; ++n)
    {
        dst[n] = src[n];
        if (src[n] == 0) break;
    }
    dst[dst_n] = 0;
}


int main() {
    human *person = (human *)malloc(sizeof(human) * 1);

    int i, k, z;
    for (i = 0; i<5; i++) {
        person = (human *)realloc(person, sizeof(human)*(i + 1));
        //I replace strcpy so it compiles on my machine
        MyStrCpy(person[i].sname, 20, "john", 5);
        person[i].sname[20] = 0;
    }

    for (i = 0; i<5; i++) {
        printf("%s\n", person[i].sname);
    }
    return 0;
}
0 голосов
/ 10 декабря 2018

Где у вас есть *person[i].sname, вы хотите вместо person[i].sname.Когда вы помещаете * перед ним, вы заставляете массив уменьшаться до указателя на его первый элемент, который при разыменовании дает значение первого элемента.

Также:

    person=(human *)realloc(person,sizeof(human)*1);

Это 1 должно быть i + 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...