具有连续内存的结构中的动æ€æ•°ç»„?

时间:2011-11-12 14:09:35

标签: c++ arrays dynamic structure allocation

struct Test
{
    int var;
    char *arr;
}

int main()
{
    Test a;
    a.arr = new char[50];
}

上é¢çš„代ç ä¼šåœ¨ç»“构中创建一个动æ€æ•°ç»„,但动æ€æ•°ç»„实际上ä¸ä¼šåœ¨ç»“构中分é…内存,其内存将被分é…到其他地方。我希望这个数组在结构中与固定数组一样分é…,但我ä¸æƒ³ä½¿ç”¨å›ºå®šæ•°ç»„。有任何想法å—? 我尽力澄清我的问题,希望你ç†è§£ã€‚

我想通过UDPå‘é€è¿™ä¸ªç»“构,UDP需è¦ç»§ç»­å†…存缓冲区å‘é€ï¼Œè¿™å°±æ˜¯ä¸ºä»€ä¹ˆæˆ‘希望这个结构有连续的内存。

7 个答案:

答案 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;      
}