c - 动态分配的结构数组传递给函数并通过索引访问

标签 c memory-management dynamic-allocation

我试图通过将指针传递给函数来动态分配结构数组。我需要使用索引访问数组。我有一个类似的过程,无需传递给函数。我有一个名为 Account 的简单结构,它只有一个成员 accountNo。下面列出的是相关的malloc调用

int8_t dynamicStruct(struct Account **all_accounts,int8_t num_accounts){
    *all_accounts = (struct Account*)malloc(sizeof(struct Account)*num_accounts);
}

变量 all_accounts 使用以下代码片段进行初始化和调用,此时 num_accounts 为 10;

struct Account *all_accounts_dyn;
dynamicStruct(&all_accounts_dyn,num_accounts);

通过以下方法访问成员变量accountNo

all_accounts[i]->accountNo = i;

程序编译良好,设法分配内存,但在访问成员时出现段错误 (num_accounts = 10)。

编译

gcc -std=gnu99 -Wall -Werror structify.c -o structify

“小型独立示例”

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdbool.h>

struct Account{
    int8_t accountNo;
};
int8_t dynamicStruct(struct Account **all_accounts,int8_t num_accounts);

int main(){
    struct Account *all_accounts_dyn;
    int8_t num_accounts = 10;
    dynamicStruct(&all_accounts_dyn,num_accounts);
    return 1;
}
int8_t dynamicStruct(struct Account **all_accounts,int8_t num_accounts){
        *all_accounts = (struct Account*)malloc(sizeof(struct Account)*num_accounts);
        for(int i = 0; i<num_accounts;i++){
            printf("initializing %d\n",i);
            all_accounts[i]->accountNo = i;
        }
        return 1;
}

最佳答案

当你有struct my_struct;时,你可以像这样访问成员:

mystuff = my_struct.stuff;

但是当你有一个指向结构struct *my_struct;的指针时,你会:

mystuff = my_struct->stuff;

这相当于:

mystuff = (*my_struct).stuff;

换句话说,您必须先取消对结构体指针的引用,然后才能访问其成员字段。

当您为 10 个结构分配内存时:

*all_accounts = (struct Account*)malloc(sizeof(struct Account)*num_accounts);

然后使用数组表示法进行访问,得到all_accounts[i] ==> *(all_accounts + i)。因此,all_accounts[i] 是一个结构体,而不是指向结构体的指针,并且必须使用点运算符进行访问。

关于c - 动态分配的结构数组传递给函数并通过索引访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40101887/

相关文章:

iphone - C 中分配内存的问题

指向结构 realloc() 错误的指针的 C 数组

c - 是否可以在运行时更改结构的定义?

c - 初始化分配数组的大小

php - cron 作业的可容忍内存使用量是多少?

javascript - 是否有可能在浏览器中发现类型化数组分配限制?

C++ 强制使用 unique_ptr 进行动态分配?

c++ - 在 C++ 类中创建的二维动态分配数组

c - C 中的 GET HTTP 请求(消息体)

c - STM32F4 nucleo 上的 HAL 驱动程序删除/读/写闪存