簡體   English   中英

使用指向結構C的指針分配數組並返回該數組

[英]Allocate array with pointers to struct C and return that array

我需要分配一個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指針。

僅在更改或標識某個字節大小時才需要類型轉換...

看來您想引用先前分配的records集,並在function分配一個指向array的指針。 雖然可以這樣做,但是您必須將現有記錄集作為參數傳遞給function ,在function分配和填充該集合,或者記錄必須在function可讀(例如,全局等)。 (您不能在指定的局部變量的地址function ,以array作為函數棧function是在其返回銷毀。)

在下面的示例中,將一個int數組傳遞給function以填充record.data成員。 如果要傳遞record數組,則可以避免為struct本身分配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] : %d\n", 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

內存使用/錯誤檢查

在您的任何動態分配內存的代碼中,對於任何分配的內存塊,您都有2個責任 :(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)

始終確認所有堆塊都已釋放-不可能發生泄漏,並且同等重要。 錯誤摘要:0個上下文中的0個錯誤 (盡管請注意:某些操作系統沒有提供足夠的內存排除文件( 該文件排除了正在報告使用中的系統和操作系統內存 ),這將導致valgrind報告尚未釋放某些內存(盡管您已經完成了操作)您的工作和所釋放的所有障礙都在您的控制之下。)

這里的小錯誤:

數組=(記錄**)malloc(sizeof(記錄*)* k);

愚蠢的我

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM