C/C++ 结构体struct中字符指针char*的赋值

我们经常需要再结构体中使用到字符数组来存储字符串。
但是有时候字符串的长度并不是固定的,所以有时候需要用到字符指针来存储字符。

在结构体中字符指针的使用和字符数组的使用稍有差别。
    如:
        在结构体中使用字符数组
        struct Student
        {
            int nAge;           // 年龄
            int nClass;         // 班级
            char cName[24];    // 姓名
        };   
        
        在结构体中使用字符指针
        struct Student
        {
            int nAge;           // 年龄
            int nClass;         // 班级
            char* pCName;        // 姓名
        }; 

结构体中使用字符数组,很明了,在创建结构体变量的时候,就已经知道字符数组的
大小,所以已经开辟好了存储字符数组的空间。
而字符指针,因为存储的只是一个地址,所以在使用的时候,我们需要为字符指针
开辟对应的需要存储的空间,再把这个空间的地址指派给结构体中的字符指针。

示例源码:

// Len_struct.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <string.h>
using namespace std;

struct Student
{
    int nAge;       // 年龄
    int nClass;     // 班级
    char *pName;    // 姓名
};

int main()
{
    int tempAge = 21;
    int tempClass = 10;
    char tempName[] = "张小菜";

    struct Student stu;
    stu.nAge = tempAge;
    stu.nClass = tempClass;
    // Student中的pName是char指针,指定的是一块内存地址,
    // 而这块内存地址用来存储数据
    stu.pName = (char*)malloc(strlen(tempName) + 1);
    if(stu.pName!= NULL)
    {
        strcpy(stu.pName, tempName);
    }
    
    cout << "\n输出学生数据:" << endl;
    cout << "\t年龄:" << stu.nAge << endl;
    cout << "\t班级:" << stu.nClass << endl;
    cout << "\t姓名:" << stu.pName << endl;
}

执行结果:

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 对于您的问题,我可以回答。将C结构体转换为二进制流,您可以使用以下方法: 1.使用memcpy()函数将结构体变量的内容复制到一个字符数组。然后使用fwrite()函数将该字符数组写入文件或套接字。 例如: ```c struct MyStruct { int a; float b; char c; }; //将结构体变量转换为二进制流 struct MyStruct s; char buffer[sizeof(struct MyStruct)]; memcpy(buffer, &s, sizeof(struct MyStruct)); //将二进制流写入文件 FILE *fp; fp = fopen("output.bin", "wb"); fwrite(buffer, sizeof(struct MyStruct), 1, fp); fclose(fp); ``` 2.使用一个打包库,如Google的protobuf或Apache Thrift,可以将结构体序列化为二进制流,并且可以跨语言进行交互。 例如,使用protobuf库: ```c //定义protobuf消息 message MyMessage { int32 a = 1; float b = 2; string c = 3; } //将结构体转换为protobuf消息 struct MyStruct s; MyMessage msg; msg.set_a(s.a); msg.set_b(s.b); msg.set_c(string(1, s.c)); //将protobuf消息序列化为二进制流 string output; msg.SerializeToString(&output); ``` 希望这些信息可以帮助到您。 ### 回答2: 在C语言,通过使用struct结构体可以定义一种数据结构,该结构体可以包含不同类型的成员变量。当需要将这个结构体转换成二进制流时,可以使用以下步骤: 1. 创建一个struct结构体对象,并对其成员变量进行赋值。 2. 创建一个指向该结构体对象的指针。 3. 使用sizeof运算符来获取结构体对象的大小,这将用于后续的二进制流缓冲区的分配。 4. 分配一个大小为结构体大小的二进制流缓冲区,可以使用malloc函数动态分配内存。 5. 将struct结构体指针转换为一个指向无类型(void)的指针。 6. 使用memcpy函数将struct结构体指针所指的内存块的数据拷贝到二进制流缓冲区。 7. 现在,二进制流已经存储在缓冲区,可以对其进行读写或者进行网络传输等操作。 8. 在结束使用后,记得使用free函数释放之前动态分配的内存空间,以避免内存泄露。 总结:通过以上步骤,我们可以将struct结构体转换成二进制流。建立结构体对象,指向它的指针,用sizeof运算符获取大小,动态分配缓冲区,使用memcpy函数拷贝数据,把结构体转换为二进制流。最后进行相应的操作后,使用free函数释放内存。 ### 回答3: 在C语言,可以使用`struct`结构体来定义一组相关的变量,并将它们作为一个整体进行处理。而将结构体转换为二进制流,在网络编程是非常常见的操作。 要将`struct`结构体转换为二进制流,可以使用`memcpy`函数来实现。首先,我们可以定义一个结构体类型,例如: ```c typedef struct { int id; char name[20]; float score; } Student; ``` 接下来,我们可以创建一个`Student`类型的结构体变量,并给其成员赋值。然后,可以通过`memcpy`函数将结构体变量的数据拷贝到一个字节数组,即转换为二进制流: ```c Student student; student.id = 1; strcpy(student.name, "Tom"); student.score = 90.5; char buffer[sizeof(Student)]; memcpy(buffer, &student, sizeof(Student)); ``` 上述代码,`buffer`是一个与结构体大小相等的字节数组。`memcpy`函数将`student`变量的数据拷贝到`buffer`数组。 如果需要将二进制流转换回`struct`结构体,可以使用相反的步骤。先创建一个目标结构体类型的变量,再通过`memcpy`函数将二进制流的数据拷贝到该变量: ```c Student student2; memcpy(&student2, buffer, sizeof(Student)); printf("Student ID: %d\n", student2.id); printf("Student Name: %s\n", student2.name); printf("Student Score: %.1f\n", student2.score); ``` 通过上述代码,我们可以将二进制流再转换回原来的结构体变量并打印出来。 总之,通过使用`memcpy`函数,我们可以在C语言方便地将结构体转换为二进制流,并在需要时将其转换回来。这在网络传输、文件IO等场景都非常有用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WendyWJGu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值