2015-05-04 3 views
-1

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

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

'' view (array_str, n); '' Потому что это уже '' starr * '' –

+0

Хотя я должен также указать, что если вы не используете '' calloc'' вместо '' malloc'', вы будете печатать мусорные байты. –

+2

Имеет ли это какое-либо отношение к 'C++'? – Galik

ответ

0
#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.

+0

Спасибо за поддержку. Я исправил удаление «&». Конечно, это только часть кода. Это всего лишь пример проблемы, потому что у меня нет Интернета, чтобы опубликовать весь полный код. Я написал это с моим телефоном. Еще раз спасибо – Jilz