关于C/C++中的结构体赋值问题

c/c++ 开发中常见的坑 总结一下自己遇到的坑,吸取教训,避免第二次、第三次在同一个地方扑街。 语言类 变量初始化问题 众所周知,局部变量在函数调用开始时创建,函数调用完成返回时“销毁”。值得注意的是,这里根本没有所谓的销毁、初始化的过程。局部变量的内存分配、回收是通过栈指针(esp)的减小、增大来完成的,注意函数栈从大地址向小地址增长。也就是说,函数栈只管分配和回收,至于这个地址空间里的内容, 它不 阅读详情
在C++11标准中,是允许对结构体进行以下赋值操作的:
#include <bits/stdc++.h>
struct book{
    char title[200];
    char author[200];
    float val;
};


int main()
{
  struct book lib {
   // "The Pious Pirate and The Devious Damsel",
    "Renee",
    1.95
  };
 printf("%s",lib.title);
  return 0;


}



既可以部分初始化,也可以全部初始化。输出结果为 Renee。
但是万万不可进行下列赋值操作:
#include <bits/stdc++.h>
struct book{
    char title[200];
    char author[200];
    float val;
};


int main()
{
  struct book lib;
  lib.title="hahahaha";
return 0;
}


理由是"hahahaha"为const char类型,不可以赋值给title这个char类型的数组。
但是,如果把title改为字符指针呢?
#include <bits/stdc++.h>
struct book{
    char *title;
    const char *author;
    float val;
};


int main()
{
  struct book lib;
  lib.title="hahahaha";
  lib.author="hohohoho";
printf("%s %s",lib.title,lib.author);
return 0;
}



输出是:hahahaha hohohoho
说明无论把字符串赋给char*p还是const char*p的字符指针都是可以的。(如果是数字数组,则完全可以单独赋值)

但是,用指针会有一个潜在的危险!!

由于该指针未经过初始化,地址可以指向任何值。所以这一操作可能会会导致程序崩溃!

如果非要想用数组表示然后在后面进行初始化,则可以使用.运算符进行赋值。

//此处title和author为字符数组
struct book lib={ .title="Renee",
		  .author="James",
		  25.99};
//或者直接使用scanf给字符数组赋值
scanf("%s",title);


「C/C++」C++经验篇 之 判断结构体数据是否被赋值的几种方法 方法适用场景是否需要 C++17备注bool标记所有情况❌ 不需要需要手动维护标记所有类型✅ 需要 C++17推荐,语义最清晰检查默认值有明确无效值的情况❌ 不需要需确保默认值不会冲突指针(unique_ptr动态分配的对象❌ 不需要需要解引用访问推荐方案如果使用 C++17+,优先选(最清晰、最安全)。如果不能用 C++17,可以用bool标记或默认值检查。如果结构体成员可能动态分配,可以用指针。希望这些方法能帮到你!如果有更具体的需求,可以进一步优化方案。何曾参静谧的博客。 阅读详情

相关推荐

(C/C++基础)结构体_初始化_赋值_定义_声明

首先介绍一下初始化、赋值、定义、声明这四个概念。 初始化:创建变量并给它赋初值。初始化和赋初值不同。初始化=带指定初始值的定义。一个程序中,一个变量只能初始化一次。如:int  i=0; 赋值:擦除对象的当前值并用新值替代,在一个程序中,一个变量可以多次赋值。 定义:用来为变量分配内存空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。例:int  i;(单纯定义)  int

u013080459的专栏 5927

c/c++ 结构体赋初值的小技巧

1.CC++结构体的初始化 今天看到项目中对自定义结构体初始化方式有点陌生,特在此罗列一下可用的结构体初始化的方式。 对结构体 struct A { int b; int c; } 有几种初始化方式: 第一种: struct A a = { .b = 1, .c = 2 }; 第二种: ...

BlueBirdssh的专栏 6505

C++ 结构体中数组可以直接赋值

一直记得C语言中,结构体是不可以直接赋值的,需要逐一成员赋值或者用memcpy函数。 但是在C++中可以(无需重载=运算符),需要区分以下3种情况: #include #include using namespace std; struct A { char a[10]; }; struct B {

h a 6 6 6 c k 为 你解决复杂难题! 2万+

C/C++结构体初始化与赋值

定义 struct Pos { double x; double y; double z; }; 方法一:定义时顺序赋值 struct Pos InitPos = {1.0, 2.0, 3.0}; 方法二:定义后逐个赋值 struct Pos InitPos; InitPos.x = 1.0; InitPos.y = 2.0; InitPos.z = ...

Keep Learning, Keep Growing, Keep Succeeding! 6584

Transformers 中的 Softmax 可以并行加速么?

通过融合前两个计算步骤,降低执行Reduce_max和Reduce_sum等操作的通信开销。利用共享内存来存储临时数据,以减少对全局内存的访问成本。

stephen147的博客 1234

Stata实战:DID平行趋势检验完整操作指南(附reghdfe+coefplot代码)

本文提供了一份使用Stata进行DID平行趋势检验的完整实战指南。文章详细讲解了从数据准备、生成相对时间变量,到利用reghdfe命令构建动态效应模型,以及使用coefplot命令进行结果可视化的全流程操作。核心在于通过检验政策前交互项的显著性,验证处理组与对照组是否满足平行趋势假设,为后续因果推断奠定可靠基础。

weixin_29231725的博客 1380

C++结构体定义 & 创建 & 赋值 & 结构体数组 & 结构体指针 & 结构体嵌套结构体 & 结构体做函数参数 & 结构体中的const使用场景

int age;int score;int age;int score;int main(){"张三",18,80},{"李四",19,60},{"王五",38,66}// 给结构体的元素赋值stu_arr[2].name = "赵六";// 遍历结构体数组i

分享计算机视觉,C++,网络摄像头研发,音视频开发,嵌入式等知识。 4541

【第4章 光模块实测方法总结(环境搭建、眼图测试、接收测试、注意事项)】

本文系统介绍了光模块测试的完整流程与关键要点,涵盖低速模块到3.2T PAM4超高速模块的测试方法。内容包括:1)测试环境搭建(光路/电路要求);2)核心测试项目(眼图分析、接收灵敏度/饱和测试、误码压力测试);3)PAM4专项测试(TDECQ、RLM线性度等);4)可靠性测试(温循、电压、老化);5)八大注意事项(如禁止脏端面测试、长短距混插等)。特别强调高速模块对测试环境的高敏感性,需重点关注波形质量而非单纯光功率,并需进行严格压力测试才能暴露潜在问题。

学无止境 448

C++ 结构体赋值

一直记得C语言中,结构体是不可以直接赋值的,需要逐一成员赋值或者用memcpy函数。 但是在C++中可以(无需重载=运算符),需要区分以下3种情况: #include&lt;iostream&gt; #include&lt;string&gt; using  namespace std;  struct  A  {  char   a[10];  };   struct  B  { ...

T的专栏 1万+

达梦的自定义类型和存储过程支持创建同义词,不支持同义词使用?

达梦8的自定义类型和存储过程支持创建同义词,但是通过同义词调用报错,而在oracle上验证没有问题,难道是发现了达梦的bug了?非也非也,详情请见下文

wy071218的专栏 979

Android客户端如何设计架构

当我们在新开发一款APP时,我们在初期要如何设计架构呢?在这里我根据我的经验,总结了一些基本的架构思路。 客户端架构设计的时候,首先需要充分考虑到所开发的app的类型,这里我分为功能型和服务型两大类,功能型的app侧重业务和功能,服务型的app侧重服务和运算。下面我就具体来讲讲针对这两种类型的通用架构。 功能型app 功能型app的activity比较多,整个app都以一个个activity承载业务和功能,在设计这类app时,我们需要考虑哪些要素呢? 由于activity比较多,我们需要考虑页面的跳转路由,

子者不语的专栏 1544

C语言结构体

1.结构体定义 声明一个结构体: typedef struct 和 struct C C++ typedef struct A{ int num; long length; }B; 申请结构体变量的方法有两种: ①struct A 变量名; ②B 变量名; 申请结构体变量的方法有...

xiaobai06的博客 279

Matlab 曲面平滑与点云处理

曲面平滑是一种常见的数学和计算机图形学技术,可以用来消除噪声、填补数据间隙,以及改善曲面的外观。在点云处理中,曲面平滑也被广泛应用于重建、拟合和可视化等领域。本文将介绍如何使用 Matlab 进行曲面平滑和点云处理,并提供相应的源代码。通过以上步骤,我们可以使用 Matlab 进行曲面平滑和点云处理。你可以根据具体需求调整参数和算法,以获得理想的曲面平滑效果。接下来,我们可以使用平滑算法对三角化的网格进行曲面平滑。以上代码将绘制原始点云和重建后的点云,并在图形中显示坐标轴和图例。表示平滑的迭代次数。

QfcaLinux的博客 752

浅析c++中的结构体struct

在表示某些结构化数据时,我们通常会使用数组来解决问题。可是由于信息比较松散、容易重名、数据存取不方便等原因,当所用数据过多时,那么使用数组解决问题便不是那么的方便了。此时,最好有一种新的数据类型,直接表示该问题的所有属性,结构体便应需而生。 什么是结构体? 由一系列具有相同类型或不同类型的数据构成的数据集合,叫做结构体(struct)。 结构由数目固定的成员构成; 各成员可以具有不同的数据类型; ...

qq_45952745的博客 2279

Python-增加b站视频播放量

如果条件允许的情况下,有代理API更好,每次请求url调用API也更方便。如果没有的话,也不用担心,网上本身也有着很多免费国内代理,不过代理是否可用需要自己花点时间去检测,检测方法笔者这里就不详述了,后面有时间的话会单独针对这一块做详细说明。在开始之前,需准备代理IP。总之,在每次请求url的时候,随机带入某个IP防止被平台检测,便于达到增加播放量预期。大致思路就是针对你的目标代理平台进行IP抓取,并存入到自己本地的IP代理池。本文是该专栏的第1篇,后面会持续更新对应平台干货知识,记得关注。

Python进阶专栏《爬虫实战进阶》,《Pyppeteer从入门到精通》原创作者 5210

【微信小程序】微信小程序 manifest.json 配置 ES6 转 ES5 开关:3步让你的代码兼容性更强

ES6(ECMAScript 6)是 JavaScript 的最新标准,引入了许多新的语法和特性,如箭头函数、模板字符串、解构赋值等。然而,不是所有的环境都支持 ES6,特别是旧版本的浏览器和一些特定的运行环境。为了确保代码的兼容性,我们需要将 ES6 代码转换为 ES5 代码。通过本文的详细讲解,相信你已经学会了如何在文件中配置微信小程序的 ES6 转 ES5 开关。这个小小的配置步骤能够显著提高代码的兼容性和稳定性。如果你有任何问题或需要进一步的帮助,欢迎随时留言交流。

java专栏 1360

【C++】结构体(struct)

目录 结构体struct的基本形式 变量定义和初始化 读写结构体内部成员 结构体赋值 结构体指针 特殊形式(匿名结构体,但一般不这么用) 另一种特殊形式(一般也不这么用) 对齐问题 结构体作为成员 我对结构体的理解:结构体是将多种数据类型组合成一个集合,这个集合就是结构体。结构体是弱化版的类,功能没有类强大。 结构体注意点:struct一般都放在最外层定义,不放在函数内定义...

mjiansun的专栏 4058

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C语言——结构体(入门详解)

本篇主要记录结构体!!!

m0_53415522的博客 901

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C语言X天学习计划——结构体、枚举

结构体1.结构体概念 1.结构体概念 概念:

数字IC 213

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C/C+语言struct深层探索

1.     struct的巨大作用 面对一个人的大型C/C++程序时,只看其对struct的使用情况我们就可以对其编写者的编程经验进行评估。因为一个大型的C/C++程序,势必要涉及一些(甚至大量)进行数据组合的结构体,这些结构体可以将原本意义属于一个整体的数据组合在一起。从某种程度上来说,会不会用struct,怎样用struct是区别一个开发人员是否具备丰富开发经历的标志。 在网络协议、通信

嵌入式Linux开发 321

C/C++编程笔记:C语言结构体想要直接赋值,应该如何实现?

首先我们来看一个实例: 我在Ubuntu 13.04下使用gcc 4.7.3 编译运行得到的结果,如下所示: 可以从结果上看出,结构体直接赋值在C语言下是可行的,我们看看struct_assign()函数的汇编实现,从而从底层看看C语言是如何实现两个结构体之间的赋值操作的: 这段汇编比较简单,由于结构体的对齐的特性,sizeof(srtruct Foo)=16,通过四次movl操作将foo1的结构体内容拷贝到结构体foo2中。从汇编上看出,结构体赋值,采用的类似于memcpy这种形式,而不

致力于C语言C++知识分享! 7556

史上最全C/C++ 结构体赋值方法详述

成员逐个赋值是最直接的赋值方法,适用于需要动态设置结构体成员值的情况。通过点运算符()或箭头运算符(->)逐个为成员赋值。在声明结构体变量的同时进行初始化是另一种常用的方法。这种方法使用大括号包围的初始化列表,按照结构体成员的声明顺序提供初始值。C99 标准引入了指定初始化器,这种方法允许我们在初始化时明确指定要初始化的成员,无需考虑成员的声明顺序。C/C++ 允许我们直接将一个结构体变量赋值给另一个同类型的结构体变量,这种方法会复制所有成员的值。对于较大的结构体,可以使用memcpy。

极客代码 3687

C语言中结构体赋值的讨论

今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题。那么就总结一下C语言中结构体赋值的问题吧: 结构体直接赋值的实现 下面是一个实例: #include struct Foo { char a; int b; double c

海风林影 3万+

详解C结构体、C++结构体 和 C++类的区别

先来说说C和C++中结构体的不同 a) C语言中的结构体不能为空,否则会报错 1>d:\myproject\visual studio 2013\projects\myc++\main.c(71): error C2016: C 要求一个结构或联合至少有一个成员 b) C语言中的结构体只涉及到数据结构,而不涉及到算法,也就是说在C中数据结构和算法是分离的。换句话说就是C语言中的结构体只能定义

Loving_Forever_的博客 2万+

C/C++结构体的初始化

1.C/C++结构体的初始化 今天看到项目中对自定义结构体初始化方式有点陌生,特在此罗列一下可用的结构体初始化的方式。 对结构体 struct A { int b; int c; } 有几种初始化方式: 第一种: struct A a = { .b = 1, .c = 2 }; 第二种: struct A a={ b:1, c:2 };...

嵘屹 2154
下一篇: 1002写出这个数(20)
donCoder
博客等级 码龄9年 65粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值