我需要分配一个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);
愚蠢我