【问题标题】:Assign to an element of a struct of a pointer array don't work (null)分配给指针数组结构的元素不起作用(空)
【发布时间】:2019-12-02 14:57:08
【问题描述】:

我是新来的编程新手。我的问题是当我尝试为数组指针结构的属性分配一个值时,它不起作用。以下代码没有结构工作:

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

int main()
{
    int *array;
    int size = 10;
    array = malloc(sizeof(int) * size);

    int i;
    for (i = 0; i < size; i++)
    {
        array[i] = i * i;
    }

    for (i = 0; i < size; i++)
    {
        printf("%d\n", array[i]);
    }
}

但是当我输入 struct 时,它会打印 (null):

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

typedef struct Person
{
    unsigned char name;
} Person;

int main()
{
    Person *personArray;
    int size = 10;
    personArray = (Person *)malloc(sizeof(int) * size);

    int i;
    for (i = 0; i < size; i++)
    {
        unsigned char name = "Person_name"; //[Warning] initialization makes integer from pointer without a cast
        personArray[i].name = name;
    }

    for (i = 0; i < size; i++)
    {
        printf("%s\n", personArray[i].name); //Print (null)
    }
}

为什么会这样? 如果我是新来的,对不起。

谢谢,下面的代码工作:

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

typedef struct Person
{
    unsigned char *name;
} Person;

int main()
{
    Person *personArray;
    int size = 10;
    personArray = (Person *)malloc(sizeof(Person) * size);

    int i;
    for (i = 0; i < size; i++)
    {
        unsigned char *name = "Person_name";
        personArray[i].name = malloc(strlen(name) + 1); //[Warning] incompatible implicit declaration of built-in function 'strlen'
        strcpy(personArray[i].name, name); //[Warning] incompatible implicit declaration of built-in function 'strcpy'
    }

    for (i = 0; i < size; i++)
    {
        printf("%s\n", personArray[i].name);
        free(personArray[i].name);
    }

    free(personArray);
}

【问题讨论】:

  • 打开编译器的警告:unsigned char name = "Person_name"; 会让它抱怨很多!
  • ...还有更多警告...

标签: c arrays pointers struct


【解决方案1】:

首先,这里

personArray = (Person *)malloc(sizeof(int) * size);

您可能想要sizeof(Person) 而不是sizeof(int)。此外,您似乎对char 和字符串有些混淆。这里是:

unsigned char name = "Person_name";

尝试将字符串文字分配给char。您的编译器应该发出警告。相反,这应该是unsigned char *name。并且还将Person 中的name 设为指针。另请注意,这不会复制。如果您想要字符串的副本,请改为:

unsigned char *name = "Person_name";
personArray[i].name = malloc(strlen(name) + 1);
strcpy(personArray[i].name, name);

如果您这样做,请在使用完毕后释放字符串,例如在打印之后:

free(personArray[i].name);

并且(无论哪种方式)完成后,别忘了释放personArray的内存:

free(personArray);

【讨论】:

  • ...然后不要忘记为person中的name分配内存并复制字符串。
  • @PaulOgilvie 没错。像现在这样,它不会是副本。当然,不清楚 OP 是否想要一份副本。
  • ...和free(pesonArray[i].name)
  • @PaulOgilvie 这已经在答案中了,但我现在把它放在自己的行上,这样它就更明显了。
  • 为什么我必须把 Person 的属性 'name' 变成一个指针?
猜你喜欢
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 2018-04-08
  • 2015-10-26
  • 1970-01-01
相关资源
最近更新 更多