带指针的结构数组

时间:2018-12-10 16:36:42

标签: c

我正在学习C。我编写了代码,错误是“传递'strcpy'的参数1使指针从整数开始而没有强制转换”。

#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 :(得分:0)

如果您有*person[i].sname,则需要person[i].sname。将*放在其前面时,将迫使该数组衰减到指向其第一个元素的指针,该指针在取消引用后将为您提供第一个元素的值。

也:

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

1应该是i + 1

答案 1 :(得分:0)

我已修复您程序中的直接问题。 不过,更深层的是如何获得所需的指针。

array[4]获取第4个元素的值。 array获取指向第一个元素的指针 &array[4]获取指向第四个元素的指针 array + 4获取指向第四个元素的指针 *(array + 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;
}