日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

【C语言进阶深度学习记录】十 C语言中:struct的柔性数组和union分析

發布時間:2023/12/10 pytorch 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C语言进阶深度学习记录】十 C语言中:struct的柔性数组和union分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文并不講C語言的基礎

文章目錄

    • 1 空struct的大小
    • 2 結構體與柔性數組
      • 2.1 柔性數組的使用方法
      • 2.2 柔性數組使用代碼案例分析
    • 3 C語言中的union分析
      • 3.1 使用union判斷系統大小端
    • 4 總結

1 空struct的大小

  • C語言中的struct可以看成是變量的集合

如果一個struct里面什么都沒有,是空的,那么它的大小是多少呢?(不考慮C++語言的特性)

實際上這在不同的編譯器中還是不一樣的。比如下面的代碼:

#include <stdio.h>struct TS {};int main() {struct TS t1;struct TS t2;printf("sizeof(struct TS) = %d\n", sizeof(struct TS));printf("sizeof(t1) = %d, &t1 = %p\n", sizeof(t1), &t1);printf("sizeof(t2) = %d, &t2 = %p\n", sizeof(t2), &t2);return 0; }
  • 使用gcc 4.4.5 編譯運行結果如下:

  • 使用vs 2017編譯運行會報錯:

所以這個問題,其實沒有什么意義(在我看來)。

2 結構體與柔性數組

  • 我們都知道C語言中的數組都是固定大小的。一開始定義數組的時候,就需要確定數組的大小。這樣其實很不友好,如果確定數組大小后后面大小又不夠,就需要給數組重新分配內存空間,這樣會帶來比較大的開銷。柔性數組可以解決這個問題。
  • 柔性數組是一種數組大小待定的數組
  • 在C語言中,可以使用結構體產生柔性數組
  • C語言中,結構體的最后一個元素可以是大小未知的數組

其中SoftArray 中的array,僅僅是一個待使用的標識符,不占用存儲空間。所以sizeof(struct SoftArray) = 4;

2.1 柔性數組的使用方法

  • 下圖是定義柔性數組,并在需要的時候為柔性數組分配合適的內存空間的代碼示例:

上述代碼完成后,將得到如下圖所示的柔性數組:

在上圖的柔性數組中,第一個元素存的是柔性數組的長度,即5 。 后面的5個元素就是柔性數組的內容。

2.2 柔性數組使用代碼案例分析

  • 下面的代碼是創建柔性數組并初始化,然后打印的C語言代碼:
#include <stdio.h> #include <malloc.h>struct SoftArray{int len;int array[]; };struct SoftArray* Creat_Soft_Array(int size){struct SoftArray* ret = NULL;if(size > 0){ret = (struct SoftArray*)malloc(sizeof(int) + size * sizeof(int));ret->len = size;}return ret; }void delete_soft_array(struct SoftArray* sa){free(sa); }void Init_SoftArray(struct SoftArray* sa){int i = 0;if(NULL != sa){for(i = 0; i<sa->len ; ++i){sa->array[i] = i+1;}} }int main(){int i = 0;struct SoftArray* sa = Creat_Soft_Array(5);Init_SoftArray(sa);for(i = 0; i<sa->len; ++i){printf("%d\n", sa->array[i]);}delete_soft_array(sa);return 0; }
  • 運行結果如下:

3 C語言中的union分析

  • C語言中的union在語法上與struct類似
  • 與struct不同的是union值分配最大成員的空間,其他成員共享這個空間。
  • 某一時刻只有一個成員是存在的。

3.1 使用union判斷系統大小端

union的使用受系統大小端的影響。系統大小端如果不懂,請自行google搜索

如下圖:

  • 如下代碼,如果打印的是1,就是小端,如歸打印的是0,就是大端
#include <stdio.h>int system_mode() {union SM{int i;char c;};union SM sm;sm.i = 1;return sm.c; }int main() {printf("System Mode: %d\n", system_mode());return 0; }
  • 在我的虛擬機Ubuntu上運行結果是1,小端模式。

4 總結

  • struct 結構體中的每個數據成員都有獨立的存儲空間
  • struct 可以通過最后的數組標識符產生柔性數組
  • union中所有數據成員共享同一個存儲空間
  • union的使用會受系統大小端的影響

總結

以上是生活随笔為你收集整理的【C语言进阶深度学习记录】十 C语言中:struct的柔性数组和union分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。