Указывая массив строк внутри пустоты

У меня небольшая проблема с передачей указателя в пустоте. Эта пустота показывает только первую позицию массива структуры. Когда цикл переходит во вторую позицию, я получаю "ошибку сегментации". Я пытался показать массив внутри основного с тем же циклом, и он работает. В чем проблема?

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);
    }
}

1 ответ

#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,

Другие вопросы по тегам