찾다
백엔드 개발C#.Net 튜토리얼C 언어의 컨소시엄에서 Null을 사용할 수 있습니까?

C에서는 NULL이 연합에서 사용될 수 있지만주의해서 처리해야합니다. NULL은 노조의 다른 구성원에게 정의되지 않은 행동을 일으킬 수 있으므로 필요에 따라 각 구성원에 대해 명확한 유효하지 않은 값을 정의하는 것이 가장 좋습니다.

C 언어의 컨소시엄에서 Null을 사용할 수 있습니까?

C의 Union에서 Null을 사용할 수 있습니까? 대답은 : 그렇습니다. 그러나 조심하십시오!

이 질문은 간단 해 보이지만 실제로 비밀이 있습니다. 표면적으로 NULL 은 NULL 포인터이며 컨소시엄은 다양한 유형의 데이터를 저장할 수있는 사람입니다. 빈 포인터를 컨소시엄에 넣는 것은 큰 일이 아닙니다. 그러나 실제로는 데이터 유형, 메모리 정렬 및 잠재적 인 정의되지 않은 동작이 포함되며, 조심하지 않으면 구덩이에 빠지게됩니다.

기본 사항을 먼저 검토합시다. NULL 은 일반적으로 C 언어로 (void *)0 으로 정의되며, 빈 주소에 대한 NULL 포인터를 나타냅니다. 노조의 경우 모든 회원은 동일한 메모리 공간을 공유하며 동시에 한 명의 회원 만 유효합니다. 핵심은 다른 유형의 멤버가 다른 메모리 크기를 차지할 수 있고 컴파일러는 성능을 최적화하기 위해 메모리 정렬을 수행한다는 것입니다.

이제 컨소시엄이 있다고 가정합니다.

 <code class="c">union MyUnion { int i; char *ptr; };</code>

우리는 이것을 사용할 수 있습니다 :

 <code class="c">union MyUnion u; u.ptr = NULL;</code>

이 코드에는 구문 오류가 없으며 컴파일러는 행복하게 수락합니다. NULL ptr 회원에게 성공적으로 할당되었습니다. 그러나 문제는 이후 ui 에 액세스하면 어떻게됩니까? 결과는 정의되지 않았습니다! NULL (일반적으로 0)은 정수로 해석되므로 int 유형의 기본값과 다를 수 있거나 메모리에서 int 의 실제 표현과 충돌 할 수 있습니다. 결과는 0 또는 다른 임의의 값일 수 있으며 프로그램이 충돌 할 수도 있습니다.

더 복잡한 예를 살펴 보겠습니다.

 <code class="c">union MyUnion { long long ll; char *ptr; double d; }; int main() { union MyUnion u; u.ptr = NULL; printf("Size of union: %zu\n", sizeof(u)); printf("u.ll: %lld\n", u.ll); // 潜在的危险! return 0; }</code>

double 예에서 노조에는 3 가지 크기 long long 크기가 포함 char * 있습니다. sizeof(u) 의 결과는 컴파일러가 이들 멤버를 정렬하는 방법에 따라 다릅니다. u.ll 에 액세스하는 것은 또한 위험합니다. NULL long long 메모리 레이아웃에서 불일치를 일으킬 수 있기 때문에 잘못된 값을 읽습니다.

따라서 구문 적으로 허용하는 동안 NULL 연합에 넣는 것은 일반적으로 좋은 생각이 아닙니다. 코드의 복잡성과 예측 불가능 성을 증가시킵니다. 필요에 따라 노조의 각 구성원에 대해 명확한 "유효하지 않은"값을 정의하는 것이 좋습니다. 예를 들어, 포인터 멤버의 경우, 특수 포인터 값을 정의 할 수 있지만 (예 : 알려진 유효하지 않은 주소에 대한 포인터이지만,이 주소에 액세스하지 않도록주의하십시오), 숫자 멤버의 경우 특수 값 (예 : -1 또는 다수)을 사용하여 무효 상태를 나타낼 수 있습니다. 이것은 NULL 직접 사용하는 것보다 더 안전하고 선명하며 디버깅하기가 더 쉽습니다.

대체로 C는 NULL 연합에 넣을 수 있지만 오류가 발생하기 쉬운 연습이며 가능한 한 많이 피하는 것이 좋습니다. 유효하지 않은 상태를 명확하게 정의하고보다 강력한 코드를 작성하는 것은 왕입니다. 프로그램의 견고성은 코드의 단순성보다 훨씬 중요합니다.

위 내용은 C 언어의 컨소시엄에서 Null을 사용할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
(超详细)VScode中配置C语言环境的方法(超详细)VScode中配置C语言环境的方法Dec 05, 2022 pm 07:05 PM

VScode中怎么配置C语言环境?下面本篇文章给大家介绍一下VScode配置C语言环境的方法(超详细),希望对大家有所帮助!

c语言中node是什么意思c语言中node是什么意思Jul 06, 2022 pm 03:51 PM

在C语言中,node是用于定义链表结点的名称,通常在数据结构中用作结点的类型名,语法为“struct Node{...};”;结构和类在定义出名称以后,直接用该名称就可以定义对象,C语言中还存在“Node * a”和“Node* &a”。

c语言怎么将数字转换成字符串c语言怎么将数字转换成字符串Jan 04, 2023 pm 03:20 PM

c语言将数字转换成字符串的方法:1、ascii码操作,在原数字的基础上加“0x30”,语法“数字+0x30”,会存储数字对应的字符ascii码;2、使用itoa(),可以把整型数转换成字符串,语法“itoa(number1,string,数字);”;3、使用sprintf(),可以能够根据指定的需求,格式化内容,存储至指针指向的字符串。

c语言开根号运算符是什么c语言开根号运算符是什么Mar 06, 2023 pm 02:39 PM

在c语言中,没有开根号运算符,开根号使用的是内置函数“sqrt()”,使用语法“sqrt(数值x)”;例如“sqrt(4)”,就是对4进行平方根运算,结果为2。sqrt()是c语言内置的开根号运算函数,其运算结果是函数变量的算术平方根;该函数既不能运算负数值,也不能输出虚数结果。

c语言数组如何初始化c语言数组如何初始化Jan 04, 2023 pm 03:36 PM

C语言数组初始化的三种方式:1、在定义时直接赋值,语法“数据类型 arrayName[index] = {值};”;2、利用for循环初始化,语法“for (int i=0;i<3;i++) {arr[i] = i;}”;3、使用memset()函数初始化,语法“memset(arr, 0, sizeof(int) * 3)”。

c语言合法标识符的要求是什么c语言合法标识符的要求是什么Aug 27, 2020 pm 01:47 PM

c语言合法标识符的要求是:1、标识符只能由字母(A~Z, a~z)、数字(0~9)和下划线(_)组成;2、第一个字符必须是字母或下划线,不能是数字;3、标识符中的大小写字母是有区别的,代表不同含义;4、标识符不能是关键字。

c语言中源文件编译后生成什么文件c语言中源文件编译后生成什么文件Nov 23, 2022 pm 07:44 PM

c语言编译后生成“.OBJ”的二进制文件(目标文件)。在C语言中,源程序(.c文件)经过编译程序编译之后,会生成一个后缀为“.OBJ”的二进制文件(称为目标文件);最后还要由称为“连接程序”(Link)的软件,把此“.OBJ”文件与c语言提供的各种库函数连接在一起,生成一个后缀“.EXE”的可执行文件。

c语言怎么计算n的阶乘c语言怎么计算n的阶乘Jan 04, 2023 pm 03:18 PM

c语言计算n的阶乘的方法:1、通过for循环计算阶乘,代码如“for (i = 1; i <= n; i++){fact *= i;}”;2、通过while循环计算阶乘,代码如“while (i <= n){fact *= i;i++;}”;3、通过递归方式计算阶乘,代码如“ int Fact(int n){int res = n;if (n > 1)res...”。

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음