У меня небольшая проблема с передачей указателя в пустоте. Эта пустота показывает только первую позицию массива структуры. Когда цикл переходит во вторую позицию, я получаю «ошибку сегментации». Я пытался показать массив внутри основного с тем же циклом, и он работает. В чем проблема?
typedef struct starr{
char string[100];
int occ;
} starr;
int main(){
int n;
starr *array_str;
//insert n and array_str
array_str=(starr *)malloc(sizeof(starr)*n);
view(&array_str,n);
}
void view(starr *array_str, n){
int i;
for(i=0;i<n;i++){
printf("String %s",array_str[i]->string);
}
}
#include <stdio.h>
#include <stdlib.h>
typedef struct starr {
char string[100];
int occ;
} starr;
void view(starr *array_str, size_t n);
int main() {
size_t n;
// initialize n
starr *array_str;
array_str = (starr *)calloc(n, sizeof(starr));
// do stuff with array_str
view(array_str, n);
free(array_str); // go! be free!
}
void view(starr *array_str, size_t n) {
size_t i;
for(i = 0; i < n; i++){
printf("String %s", array_str[i].string);
}
}
1: view
принимает starr *
, а также array_str
это уже тот тип, поэтому нет необходимости ссылаться на него &
,
2: так как array_str
это starr *
его индекс (например, array_str[i]
) это starr
так что используйте .
обозначение вместо ->
нотации.
3: calloc
очистит байты при объявлении памяти, чтобы они были инициализированы в NULL
байт, и вы избежите печати строки, которая может вызвать переполнение буфера, если вы по какой-либо причине не дадите им правильные значения.
4: n
должен быть типа size_t
быть согласованным с его значением, которое является числом индексов в массиве.
5: не забудьте free(array_str);
так как вы инициализировали его с помощью malloc
/ calloc
,