程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言變長消息定義:柔性數組

C語言變長消息定義:柔性數組

編輯:關於C語言

C語言變長消息定義:柔性數組


在游戲前後端交換的過程中,經常會用到變成的消息體,因為有的內容的大小是位置的,例如一條微博,微博的內容大小是未知的。

一般的做法是定義一個char*類型的指針,然後指定其長度,代碼如下:

typedef struct{
	unsigned len;
	char* pData;
}Msg;

使用的時候是這樣的:

	char str[] = "hello world!";
	unsigned len = sizeof(str);

	Msg* m = (Msg*)malloc(sizeof(Msg)+len*sizeof(char));
	m->len = len;
	m->pData = (char*)(m+1);
	memcpy(m+1, str, len);
	printf("%d, %s\n", m->len, m->pData);

有沒有覺得時機上char* pData很多余呢?

因為數據時機的存儲位置在m+1,我們可以直接得到這個指針,而不需要重新定義一個char* pData來報錯這個位置。

這樣帶來了另一個問題就是,訪問不方便,我們不能用結構體成員的方式來訪問了,可以使用柔性數組,且看:

typedef struct{
	unsigned len;
	char data[];
}Message;

使用起來就是這樣的:

	Message* msg = (Message*)malloc(sizeof(Message) + len*sizeof(char));
	msg->len = len;
	memcpy(msg->data, str, len);
	printf("%d, %s\n", msg->len, msg->data);
	free(msg);

來分完整代碼對比下:


// array0.h

typedef struct{
	unsigned len;
	char* pData;
}Msg;


typedef struct{
	unsigned len;
	char data[];
}Message;

// main.c

// test for 0 size array
#include 
#include 
#include 
#include "array0.h"


int main()
{
	char str[] = "hello world!";
	unsigned len = sizeof(str);


	// 普通用法
	Msg* m = (Msg*)malloc(sizeof(Msg)+len*sizeof(char));
	m->len = len;
	m->pData = (char*)(m+1);
	memcpy(m+1, str, len);
	printf("%d, %s\n", m->len, m->pData);
	free(m);


	// 柔性數組
	Message* msg = (Message*)malloc(sizeof(Message) + len*sizeof(char));
	msg->len = len;
	memcpy(msg->data, str, len);
	printf("%d, %s\n", msg->len, msg->data);
	free(msg);


	system("pause");


	return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved