【问题标题】:confused with structs and pointers [closed]与结构和指针混淆[关闭]
【发布时间】:2016-03-11 13:13:26
【问题描述】:

我正在尝试用字符串填充结构。

struct person {
    char *name
    char age
};

int record_values(struct person *dude, const char *his_name, char his_age) 
{
    dude->name = malloc(strlen(his_name)*sizeof(char));    //Get space for name
    strcpy(dude->name, his_name);                          //Set name
    strcpy(dude->age, his_age);                            //Set age
}

但是这不起作用。有什么帮助吗?

【问题讨论】:

  • “不起作用”是什么意思?
  • @HimBromBeere 这看起来更像 C 而不是 C++
  • 请告诉我们,您使用纯 C 还是 C++,在这两种语言中可能有不同的方法来实现。
  • 使用std::string 并将record_values 作为struct 的成员函数(或将问题标记为c)。
  • 我以为我使用的是 c 标签,而不是 c++ :)

标签: c struct


【解决方案1】:
dude->name = malloc(strlen(his_name)*sizeof(char));    //Get space for name
strcpy(dude->name, his_name);                          //Set name
strcpy(dude->age, his_age);                            //Set age

您的第一行没有分配足够的空间。字符串终止符需要一个字节。

您的最后一行调用strcpy,但his_age 不是字符串。

【讨论】:

  • 你还需要在 C++ 中进行强制转换(所以最好使用 new),而 sizeof(char) 只是一个噪音。
【解决方案2】:
int record_values(struct person *dude, const char *his_name, char his_age) 
{
    dude->name = strdup(his_name);   // Duplicate name
    dude->age = his_age;             // Set age (Simple assignment!)
}

【讨论】:

    【解决方案3】:

    这里没有给出你应该在代码中改变什么的指针,而是一个完整的工作示例,希望能显示所需的差异。下面的代码首先创建了一个struct person,但是当调用record_values() 函数时,您会看到它首先必须检查dude-name 是否已经指向char 数组。不进行此检查会在您的代码中造成内存泄漏,并且之前的 dude->name 将永远不会被释放。它还在 char 数组中为字符串终止符分配了一个额外的 char 空间(strcpy 也会复制它)。这将避免溢出错误。该函数不返回任何内容,因此请将其设为 void 函数,而不是返回 int 的函数。 dude->age 的值不是指向内存空间的指针,因此不应使用strcpy,而应使用复制变量值的dude->age = his-age

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct person {
        char *name;
        char age;
    };
    
    struct person * record_alloc(const char *his_name, char his_age);
    void            record_values(struct person *dude, const char *his_name, char his_age);
    void            record_free(struct person * dude);
    
    
    struct person * record_alloc(const char *his_name, char his_age){
        struct person * dude;
    
        dude = malloc(sizeof(struct person));
        if (his_name != NULL){
            record_values(dude, his_name, his_age);
        } else {
            dude->age   = 0;
            dude->name  = NULL;
        }
        return dude;
    }
    
    void record_values(struct person *dude, const char *his_name, char his_age)
    {
        size_t nameSize;
    
        if (dude->name)
            free(dude->name);
    
        nameSize = (strlen(his_name) + 1) * sizeof(char);
        dude->name = malloc(nameSize);
        strcpy(dude->name, his_name);
        dude->age  = his_age;
        return;
    }
    
    void record_free(struct person * dude){
        if (dude->name)
            free(dude->name);
    
        free(dude);
        return;
    }
    
    int main(int argc, const char * argv[]) {
        struct person * p;
    
        // allocate and set values
        p = record_alloc("John Smith", 32);
        printf("%s is %i years old\n", p->name, p->age);
    
        // set new values for p
        record_values(p, "John Doe", 37);
        printf("%s is %i years old\n", p->name, p->age);
    
        // free p
        record_free(p);
    
        return 0;
    }
    

    【讨论】:

    • sizeof(char) 根据定义总是等于一,所以只需使用nameSize = strlen(his_name) + 1
    【解决方案4】:

    您可能更喜欢使用designated initializers

    #include <stdio.h>
    #include <string.h>
    
    typedef struct {
        char *name;
        char age;
    } person;
    
    int record_values(person *dude, const char *his_name, char his_age) 
    {
        *dude = (person) {.name = strdup(his_name), .age = his_age};
    }
    
    int main()
    {
        person p;
        record_values(&p, "bob", 27);
        printf("Hello, I am %s and I am %d years old!\n", p.name, p.age);
        return 0;
    }
    

    您好,我是 Bob,今年 27 岁!

    由于 strdup 是 not a part of c99,您的编译器可能会生成警告,要消除它们,您需要使用 -std=gnu99 编译它:

    gcc -std=gnu99 -o main *.c
    

    或使用您自己的版本,可能如下所示:

    #include <stdlib.h>
    char * strdup(const char *in) {
        char *out = malloc(sizeof(in) + 1);
        int i;
        for (i = 0; in[i] != '\0'; ++i)
            out[i] = in[i];
        return out;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      • 1970-01-01
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多