struct Test
{
int var;
char *arr;
}
int main()
{
Test a;
a.arr = new char[50];
}
上é¢çš„代ç 会在结构ä¸åˆ›å»ºä¸€ä¸ªåŠ¨æ€æ•°ç»„,但动æ€æ•°ç»„实际上ä¸ä¼šåœ¨ç»“æž„ä¸åˆ†é…内å˜ï¼Œå…¶å†…å˜å°†è¢«åˆ†é…到其他地方。我希望这个数组在结构ä¸ä¸Žå›ºå®šæ•°ç»„ä¸€æ ·åˆ†é…,但我ä¸æƒ³ä½¿ç”¨å›ºå®šæ•°ç»„。有任何想法å—? æˆ‘å°½åŠ›æ¾„æ¸…æˆ‘çš„é—®é¢˜ï¼Œå¸Œæœ›ä½ ç†è§£ã€‚
我想通过UDPå‘é€è¿™ä¸ªç»“构,UDP需è¦ç»§ç»å†…å˜ç¼“冲区å‘é€ï¼Œè¿™å°±æ˜¯ä¸ºä»€ä¹ˆæˆ‘希望这个结构有连ç»çš„内å˜ã€‚
ç”案 0 :(得分:3)
ä½ ä¸èƒ½è¿™æ ·åšï¼Œå› 为新内å˜æ¥è‡ªå †/å…è´¹å•†åº—ï¼Œä½ çš„aå°†åœ¨å †æ ˆä¸Šåˆ†é…....
ä½ å¯ä»¥ä½¿ç”¨malloc / new分é…一个sizeof testçš„è¿žç»å†…å˜å—+ä½ éœ€è¦çš„大å°ï¼Œå¹¶ä½¿æŒ‡é’ˆarr指å‘Test结构的末尾。
å¦‚æžœä½ éœ€è¦åœ¨å †æ ˆçš„åŠŸèƒ½èŒƒå›´å†…ï¼Œä½ å¯ä»¥ä½¿ç”¨alloca。
Test *a = (Test*)alloca(sizeof(Test)+yoursize);
a->arr = (char*)a+sizeof(Test)...
ç”案 1 :(得分:1)
ä¸ï¼Œä½ ä¸èƒ½åœ¨C ++ä¸æ‹¥æœ‰å¯å˜é•¿åº¦æ•°ç»„ æ‰€ä»¥ä½ ä¸èƒ½è¿™æ ·åšã€‚
您å¯ä»¥ä½¿ç”¨å›ºå®šé•¿åº¦çš„阵列,也å¯ä»¥ä½¿ç”¨æ‚¨æ供的方法。
å¦ä¸€ç§æ–¹æ³•æ˜¯ï¼Œ
您å¯ä»¥ä½¿ç”¨å±•ç¤ºä½ç½®æ–°å°†é˜µåˆ—放置在预先分é…的内å˜ä½ç½®ã€‚这个内å˜å¯èƒ½åœ¨å †æ ˆä¸ã€‚
ç”案 2 :(得分:0)
您的代ç æ— æ³•ç¼–è¯‘ã€‚æ‚¨åº”è¯¥åœ¨å¯ç”¨æ‰€æœ‰è¦å‘Šçš„情况下编译它,并在没有è¦å‘Šçš„æƒ…å†µä¸‹è¿›è¡Œæ”¹è¿›ã€‚ä½ æ£åœ¨å¦ä¹ C或C ++å—?如果是C ++,请考虑使用std::vector
ç”案 3 :(得分:0)
struct Test {
int var;
char arr[1];
};
int main()
{
std::vector<char> buf;
buf.resize(sizeof(Test) + 50);
Test *foo = reinterpret_cast<Test *>(&buf[0]);
foo->arr[40] = 'b';
}
ç”案 4 :(得分:0)
您å¯ä»¥å°†æ•°ç»„大å°ä¼ é€’ç»™ç»“æž„æž„é€ å‡½æ•°ï¼Œå¹¶ä¸ºé‚£é‡Œçš„æ•°ç»„åˆ†é…内å˜ã€‚ä¸è¦å¿˜è®°åœ¨æŸä¸ªåœ°æ–¹è§£é™¤åˆ†é…,例如在æžæž„函数ä¸ï¼š
struct Test
{
int m_var;
char *arr;
public:
Test(int var) : m_var(var)
{
arr = new char[m_var];
}
~Test()
{
delete[] arr;
arr = 0;
}
};
void main(int argc, char* argv[])
{
Test t(50);
return 0;
}
ç”案 5 :(得分:0)
虽然它没有åƒCä¸é‚£æ ·â€œç¥ç¦â€ï¼Œä½†å¤§å¤šæ•°ç¼–译器ä»ä¼šè®©ä½ 使用“struct hackâ€ï¼š
struct variable_array {
size_t size;
char data[1];
};
“技巧â€æ˜¯æŒ‡åœ¨åˆ†é…它时,为è¦å˜å‚¨çš„æ•°æ®åˆ†é…足够的空间(但这æ„味ç€å¿…须动æ€åˆ†é…):
variable_array *a = (variable_array *) ::operator new(sizeof(*a) + data_size);
a->size = data_size;
ç†è®ºä¸Šï¼Œè¿™ä¸æ˜¯å¿…须的 - 编译器å¯ä»¥å¯¹data
æˆå‘˜çš„引用进行绑定检查,以确ä¿æ‚¨ä¸ä¼šåœ¨æ‚¨å·²å°†å…¶å®šä¹‰ä¸ºåœ¨ç»“构定义ä¸ä¿ç•™çš„å…ƒç´ ã€‚å®žé™…ä¸Šï¼Œæˆ‘ä¸çŸ¥é“有哪一个编译器会åšè¿™æ ·çš„事情,并且有点怀疑å˜åœ¨è¿™æ ·çš„事情。很多C代ç å·²ç»åšäº†å¾ˆå¤šå¹´è¿™æ ·çš„事情,所以åšè¿™æ ·ä¸€ä¸ªæ£€æŸ¥çš„编译器就ä¸èƒ½ç”¨å¾ˆå¤šçœŸå®žä»£ç ,å³ä½¿æ ‡å‡†å…许它。 C99还将æ¤è¯è¨€ï¼ˆè¯æ³•ç•¥æœ‰ä¸åŒï¼‰æ·»åŠ 为该è¯è¨€çš„官方功能。
底线:它有点笨拙,但真æ£æ— 效的å¯èƒ½æ€§å‡ 乎完全是ç†è®ºä¸Šçš„。
ç”案 6 :(得分:0)
ä¸æ˜¯çœŸæ£çš„动æ€åˆ†é…,但å¯èƒ½ä¼šè§£å†³æ‚¨çš„问题(å–决于您是å¦å§‹ç»ˆåœ¨ç¼–译时知é“所需的数组大å°ï¼‰
template <size_t ArraySize>
struct Test
{
int var;
char arr[ArraySize];
}
int main()
{
Test<50> a;
}