Я пытаюсь динамически выделить массив структур, передав указатель на функцию. Мне нужно получить доступ к массиву с помощью индексации. У меня есть аналогичный процесс, работающий без перехода к функции. У меня есть простая структура под названием 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;
Программа компилируется нормально, память выделяет, но segfaults при доступе к элементу (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;
}
Account
и обращаетесь к ним с помощьюall_accounts[10]
, что, конечно, выходит за рамки допустимого? - person ad absurdum   schedule 18.10.2016all_accounts[0]
— это указатель наall_accounts_dyn
, но основные индексы — это UB... - person LPs   schedule 18.10.2016void*
Такой тип может быть присвоен любому другому указателю. Приведение возвращаемого типа просто загромождает код, затрудняя его понимание, отладку и поддержку. Настоятельно рекомендуем удалить приведение значения, возвращаемого вызовом любой из этих функций. При вызове любой из функций выделения памяти всегда проверяйте (!=NULL) возвращаемое значение, чтобы убедиться, что операция прошла успешно. - person user3629249   schedule 20.10.2016main()
. Любое значение, отличное от 0, указывает на сбой. Настоятельно рекомендуем (в функции main()) заменитьreturn 1;
наreturn 0
(или в современных компиляторах не используйтеreturn 0;
, и компилятор будет иметь функциюmain()
, возвращающую 0 - person user3629249   schedule 20.10.2016gcc
как минимум используйте:-Wall -Wextra -pedantic
я также использую:-Wconversion -std=gnu99
). - person user3629249   schedule 20.10.2016dynamicStruct()
возвращаетint8_t
некоторого странного значения 1, и вызывающая сторона не проверяет это значение. Предложите изменить возвращаемый тип наvoid
- person user3629249   schedule 20.10.2016#include
файлы заголовков, которые не используются. - person user3629249   schedule 20.10.2016