如何为struct中的int数组分配内存

时间:2015-10-14 04:06:52

标签: c memory malloc allocation

我有一个结构

 typedef struct
 {
  int size; //size of array
  int array*
 } 

如何使用size变量和malloc

为int数组分配内存

3 个答案:

答案 0 :(得分:1)

int *ptr;
ptr = malloc(sizeof *ptr * size);
//can now reference ptr[0], ptr[1], ... ptr[size-1].

以上代码的作用:为int数组分配内存时,为每个所需元素分配4个字节的内存(sizeof(int))。因此,当你使用malloc时,你可以将元素的大小乘以你需要的元素数量。

答案 1 :(得分:1)

您可以创建一个初始化结构的函数,您可以创建一个这样的函数:

<button ng-click="shuffleData()">RELOAD</button>

Here是一个有效的工作人员。

答案 2 :(得分:1)

您的问题的答案取决于您是否声明了struct指向 mystruct s的指针。如果您声明了一个结构(例如s.size),那么您只需要为s.array中的typedef struct mystruct { int size; int *array; } mystruct; ... mystruct s; s.size = 5; /* allocating array based on size */ s.array = malloc (s.size * sizeof *s.array); if (!s.array) { fprintf (stderr, "error: virtual memory exhausted.\n"); return 1; } 元素分配内存。 e.g:

malloc

注意:您必须验证分配成功,并且malloc每次致电s.array时实际返回了有效地址。 (您可以创建一个函数来执行此操作以减少键入)。完成后,您只需要免费struct

但是,如果您声明指向 mystruct *msp = NULL;指针(例如msp),则现在必须为msp->arraymystruct *msp = NULL; msp = malloc (sizeof *msp); if (!msp) { fprintf (stderr, "error: virtual memory exhausted.\n"); return 1; } msp->size = 5; /* allocating array based on size */ msp->array = malloc (msp->size * sizeof *msp->array); if (!msp->array) { fprintf (stderr, "error: virtual memory exhausted.\n"); return 1; } 分配内存。例如:

free

完成后,您必须array

以下是一个快速示例,显示了#include <stdio.h> #include <stdlib.h> typedef struct mystruct { int size; int *array; } mystruct; int main (void) { size_t i = 0; size_t nelements = 0; int rd = 0; /* * declaring a struct mystruct */ mystruct s; s.size = 5; /* allocating array based on size */ s.array = malloc (s.size * sizeof *s.array); if (!s.array) { fprintf (stderr, "error: virtual memory exhausted.\n"); return 1; } /* fill array */ for (rd = 0; rd < s.size; rd++) if (scanf ("%d", &s.array[nelements]) == 1) nelements++; for (i = 0; i < nelements; i++) printf (" s.array[%zu] = %d\n", i, s.array[i]); /* free allocated memory */ free (s.array); putchar ('\n'); /* * declaring a pointer to mystruct */ mystruct *msp = NULL; /* allocate memory for msp (mystruct pointer) */ msp = malloc (sizeof *msp); if (!msp) { fprintf (stderr, "error: virtual memory exhausted.\n"); return 1; } msp->size = 5; /* allocating array based on size */ msp->array = malloc (msp->size * sizeof *msp->array); if (!msp->array) { fprintf (stderr, "error: virtual memory exhausted.\n"); return 1; } /* fill array */ rd = 0; nelements = 0; for (rd = 0; rd < msp->size; rd++) if (scanf ("%d", &msp->array[nelements]) == 1) nelements++; for (i = 0; i < nelements; i++) printf (" msp->array[%zu] = %d\n", i, msp->array[i]); /* free allocated memory */ free (msp->array); free (msp); return 0; } 在两种情况下的内存分配,使用和释放:

$ printf "2\n4\n6\n8\n10\n12\n14\n16\n18\n20\n" | ./bin/struct_alloc_int
 s.array[0] = 2
 s.array[1] = 4
 s.array[2] = 6
 s.array[3] = 8
 s.array[4] = 10

 msp->array[0] = 12
 msp->array[1] = 14
 msp->array[2] = 16
 msp->array[3] = 18
 msp->array[4] = 20

示例使用/输出

valgrind

内存错误检查

在您编写的任何动态分配内存的代码中,您必须使用内存错误检查程序。对于Linux $ printf "2\n4\n6\n8\n10\n12\n14\n16\n18\n20\n" | valgrind ./bin/struct_alloc_int ==20515== Memcheck, a memory error detector ==20515== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al. ==20515== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info ==20515== Command: ./bin/struct_alloc_int ==20515== s.array[0] = 2 <snip> msp->array[4] = 20 ==20515== ==20515== HEAP SUMMARY: ==20515== in use at exit: 0 bytes in 0 blocks ==20515== total heap usage: 3 allocs, 3 frees, 56 bytes allocated ==20515== ==20515== All heap blocks were freed -- no leaks are possible ==20515== ==20515== For counts of detected and suppressed errors, rerun with: -v ==20515== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2) 是正常的选择。有许多微妙的方法来滥用可能导致实际问题的内存块,没有理由不这样做。每个平台都有类似的记忆检查器。它们易于使用。只需通过它运行您的程序。

<select style="width:100%" id="repeatSelect" ng-model="selectedArea">