struct a1{
int a;
int b;
};
struct bb{
a1 list[];
}
像这样在结构体 bb 中定义了 a1 类型的动态数组。
应该如何使用 bb 这个结构体?有没有代码
1
liyang5945 2023-07-19 15:18:15 +08:00
需要知道 a1 的 length ,不然没法搞
|
2
codehz 2023-07-19 15:21:48 +08:00
c 里有 flexible array member ( https://en.cppreference.com/w/c/language/struct ),c++里可没有,不建议搞
|
3
ArcanusNEO 2023-07-19 15:35:26 +08:00
如果不能用 STL 容器的话,可以试试零长度数组这个 gcc 扩展,缺点是 msvc 用不了、会引入很多 C 风格代码、一个结构体里只能存在一个零长度数组
|
4
ArcanusNEO 2023-07-19 15:55:48 +08:00
@ArcanusNEO stackoverflow 上 flexible array member [相关的讨论]( https://stackoverflow.com/a/67894135)
|
5
ysc3839 2023-07-19 16:03:30 +08:00 via Android
@ArcanusNEO MSVC 好像能用?印象中 Windows SDK 里面就用到了。去搜索了一下,只是会产生 warning 。
|
6
thorneLiu 2023-07-19 16:08:11 +08:00 via Android
土问这个 a1 list[]合法吗
为啥不用 STL? |
7
ArcanusNEO 2023-07-19 16:11:09 +08:00
@ysc3839 搜了一下似乎确实可以,不过印象里曾经因为相关的写法编译失败。可能比 gcc 多一些限制,也可能只是我记错了。。。
|
8
tyzandhr 2023-07-19 16:14:18 +08:00
为什么不用指针?
|
9
ArcanusNEO 2023-07-19 16:15:57 +08:00
|
10
ysc3839 2023-07-19 16:16:54 +08:00 via Android
@thorneLiu 有的时候想要扁平可变长的,比如开头一个 size ,后面重复多个元素,用 STL 的话就不能一个指针传递全部数据了。
|
11
yolee599 2023-07-19 16:54:40 +08:00
放一个指针,然后 malloc [doge]
|
12
Perfect1zsh1t 2023-07-19 17:47:19 +08:00
```cpp
/************************************************************************* > File Name: test.c > Author: JerryChen > Created Time: 三 7/19 17:27:42 2023 > Description: ************************************************************************/ #include <stdlib.h> #include <stdio.h> #include <string.h> #define N 10 // the length of softarray typedef struct A1 { int a; int b; }a1; typedef struct bb { int len; a1 list[]; }a1_array; void init_function(a1_array *t) { int i = 0; for(i = 0; i < N; ++i) { t->list[i].a = i; t->list[i].b = i << 1; } } void print_array(a1_array *t) { int i = 0; for(i = 0; i < N; ++i) { printf("%d %d\n", t->list[i].a, t->list[i].b); } } int main() { a1_array *t = (a1_array *)malloc(sizeof(a1_array) + sizeof(*(t->list)) * N); memset(t, 0, sizeof(*(t->list))); t->len = N; init_function(t); // 初始化 list print_array(t); return 0; } ``` |
13
cnbatch 2023-07-19 17:58:23 +08:00 via Android
struct bb { a1 list[1]; };
然后 std::unique_ptr<int64_t[]> ptr = std::make_unique<int64_t[]>(100); bb *bb_ptr = (bb*)ptr.get(); bb_ptr->list[50].a = 100; |
14
cnbatch 2023-07-19 18:02:40 +08:00 via Android
|
15
bfjm 2023-07-19 23:07:00 +08:00 via iPhone
柔性数组吧
|
16
changz 2023-07-20 01:07:58 +08:00 via Android
看看 php 内核的字符串怎么实现的
|
17
nooneanyone 190 天前
柔性数组,屁股后面开空间想放啥放啥,自己控制内存布局就行了。
|