分配带有指向结构体C的指针的数组,并返回该数组



我需要分配一个k大小的数组,其中包含指向函数内部结构的指针,并将该数组返回给main。

我的结构是:

typedef struct record
{
   /*Data*/
}record;

我的函数:

record** function(int k)
{
     record** array;
     array = (record*)malloc(sizeof(record *) * k); 
     /* fulfill array 
     array[1] = &record1 ; /* For example*/
     */
     return array;
}
在主要

:

int main(void)
{
   record** arr ;
   arr = function(5);
   int i;
   for(i=0;i<5;i++)
   {
      print(array[i]); /*iterate the array*/
   }
 }

问题是,当我试图打印我的arr返回后,我得到分割错误

在这种情况下,

seg错误是因为您试图解引用NULL内存地址。

首先,您应该检查数据块是否为NULL,然后取消引用…你违反了C语言指针的第一条规则。

第二,不要对malloc指针进行类型转换。

typecast仅在更改或标识特定字节大小时才需要…

看来你想引用以前分配的records集,并在function中分配一个指向array的指针。虽然你可以这样做,但你必须将现有的记录集作为参数传递给function,在function中分配和填充该集,或者记录必须在function中可读(例如全局的,等等)。(不能将function的局部变量地址赋值给array,因为function的函数栈在返回时被销毁。)

在下面的例子中,int的数组被传递给function来填充record.data成员。如果您传递的是一个record数组,那么您将消除为struct本身分配的地址,因为您可以将地址分配给您首先分配的指针。看一遍,如果有问题请告诉我,或者如果你需要看其他形式的例子:

#include <stdio.h>
#include <stdlib.h>
typedef struct {
    int data;
} record;
record **function (int *thedata, int k)
{
    record **array = malloc (k * sizeof *array); /* allocate pointers */
    if (array && thedata)
        for (int i = 0; i < k; i++) {
            array[i] = malloc (sizeof **array);  /* allocate struct */
            array[i]->data = thedata[i];
        }
    return array;
}
int main (void) {
    record **arr = NULL;
    int a[] = { 5, 10, 15, 20, 25 },
        n   = sizeof a/sizeof *a;
    if ((arr = function (a, n))) {  /* validate function return */
        for (int i = 0; i < n; i++) {
            printf (" arr[%d] : %dn", i, arr[i]->data);
            free (arr[i]);
        }
        free (arr); /* free allocated pointers */
    }
    else
        fprintf (stderr, "error: function returned NULL.n");
    return 0;
}

使用/输出示例

$ ./bin/p2p2i
 arr[0] : 5
 arr[1] : 10
 arr[2] : 15
 arr[3] : 20
 arr[4] : 25

内存使用/错误检查

在你编写的任何动态分配内存的代码中,你有两个责任关于任何分配的内存块:(1)始终保留指向内存块的起始地址的指针,因此(2)当不再需要时,可以被释放

你必须使用一个内存错误检查程序来确保你没有写超出/超出你分配的内存块,试图读取或在一个未初始化的值上跳跃,最后确认你已经释放了所有你分配的内存。对于Linux, valgrind是正常的选择,例如:

$ valgrind ./bin/p2p2i
==6703== Memcheck, a memory error detector
==6703== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==6703== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==6703== Command: ./bin/p2p2i
==6703==
 arr[0] : 5
 arr[1] : 10
 arr[2] : 15
 arr[3] : 20
 arr[4] : 25
==6703==
==6703== HEAP SUMMARY:
==6703==     in use at exit: 0 bytes in 0 blocks
==6703==   total heap usage: 6 allocs, 6 frees, 60 bytes allocated
==6703==
==6703== All heap blocks were freed -- no leaks are possible
==6703==
==6703== For counts of detected and suppressed errors, rerun with: -v
==6703== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 1 from 1)

总是确认所有的堆块都被释放了——没有泄漏是可能的和同样重要的ERROR SUMMARY: 0 errors from 0 contexts。(尽管注意:一些操作系统没有提供足够的内存排除文件(排除系统和操作系统内存的文件,从被报告为使用),这将导致valgrind报告一些内存尚未被释放(尽管事实上你已经完成了你的工作并释放了你分配的所有块,并在你的控制下)

这里有个小错误:

array = (record**)malloc(sizeof(record *) * k);

愚蠢我

相关内容

  • 没有找到相关文章

最新更新