如何在struct *中为char *字段分配内存

时间:2017-07-21 12:15:39

标签: c pointers struct malloc

如何为struct中的SELECT t.id, t.customerid, t.price, (SELECT sum(price) FROM Table1 WHERE Id <= t.id) 'CalculatedTotal' FROM Table t HAVING CalculatedTotal <=200 字段分配内存?

我的结构:

char *

如何将malloc转移到 struct student{ int score; char* name; char* surname; }; int main(){ struct student st[]; int i; int n = 5; for(i = 0; i < n; i++){ printf("Score: \n"); scanf("%d", &st[i].score); printf("Name \n"); scanf("%s", &st[i].name); printf("Surname \n"); scanf("%s",&st[i].surname) } } char* name? 我必须有char* surname形式的结构数组。

我不知道,这是怎么理性的。

struct student st[]

如何匹配?

3 个答案:

答案 0 :(得分:3)

例如

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

//...

struct student st[1];
char *name = "Marek";
char *surname = "Piszczaniuk";

st[0].name = malloc( strlen( name ) + 1 );
strcpy( st[0].name, name );

st[0].surname = malloc( strlen( surname ) + 1 );
strcpy( st[0].surname, surname );

st[0].score = 100;

您可以编写单独的函数来设置数组元素的数据成员名称和姓氏。

例如

_Bool set_name( struct student *st, const char *name )
{
    st->name = malloc( strlen( name ) + 1 );
    _Bool  success = st->name != NULL;

    if ( success )
    {
        strcpy( st->name, name );
    }

    return success;
}

答案 1 :(得分:0)

您需要编写一个initialise_student(struct student* s)函数,在malloc成员上调用char*。也许这个函数也需要namesurname char* pointers进行深层复制?

然后,您可以使用st数组的每个成员调用此函数。

不要忘记构建相应的free_student(struct student* s)功能。

答案 2 :(得分:0)

如果您已经在使用scanf,则可以告诉该功能使用%ms代替%s为您分配刺痛,如下所示:

char *name;
if (scanf("%ms", &name) != 1) {
    fprintf(stderr, "error: could not read name\n");
    exit(1);
}

编辑这可能不是有效的解决方案 - 我忘了%ms仅在POSIX中,而不是在ISO C中。