2016-10-27 1 views
1

У меня есть структура, которая выглядит как -Как дать размер элемента массива структуры в C во время выполнения

struct stack{ 
int top; 
char string[size][80]; 
}stackV; 

Я хочу, чтобы дать пользователю возможность выделить размер символа массива строк во время выполнения. я использовал функцию зсапЕ, чтобы сделать это -

Я пытался для того чтобы достигнуть его, делая -

int size=0; 
struct stack{ 
    int top; 
    char string[size][80]; 
} stackV; 

Но, делая это, я получил предупреждение, которое говорит - переменно модифицированную «строка» в области видимости файла

Есть ли способ, по которому мы можем назначить размер массиву элементов структуры. Я не могу создать структуру внутри любой функции, потому что элемент структуры также используется другими функциями.

+1

Ищите «гибкий элемент массива». –

+0

Если вы используете структуру данных стека, попробуйте использовать динамическое распределение памяти. – RoadRunner

+0

Вы можете использовать 'malloc'. – Swanand

ответ

-2

Этот код компилируется правильно для меня:

int size = 10; 

typedef struct 
{ 
    int top; 
    char string[size][80]; 
} stackv; 

Я использую:

$ gcc --version 
gcc (Debian 5.4.1-3) 5.4.1 20161019 
Copyright (C) 2015 Free Software Foundation, Inc. 
+0

Потому что вы не поместили его в область видимости файла, очевидно. Это не отвечает на вопрос. – Lundin

2

Вы можете использовать гибкий элемент массива добиться того, что вам нужно:

#include <stdlib.h> 
#include <string.h> 
#include <stdio.h> 

typedef struct 
{ 
    int top; 
    char string[][80]; 
} stackv; 

int main() 
{ 
    size_t strings = 3; 

    stackv* s = malloc(sizeof(stackv) + strings*80); 
    strcpy(s->string[0], "test"); 
    strcpy(s->string[1], "hello"); 
    strcpy(s->string[2], "world"); 

    for(size_t i=0; i<strings; i++) 
    { 
    puts(s->string[i]); 
    } 

    free(s); 
    return 0; 
} 

Объявление char string[][80]; сообщает компилятору t в конце структуры будет неизвестно количество массивов char [80].

Таким образом, sizeof(stackv) будет давать только размер всех остальных членов, кроме последнего (в этом случае целое число).

0

Вы не знаете, сколько элементов будет в вашем стеке. Только пользователь дает вам «размер» во время выполнения; поэтому вы не можете выделять массив статически (время компиляции), но выделяете его динамически (время выполнения) при получении размера от пользователя. Вы получаете «предупреждение», потому что вы определяете «размер» от размера «0», тогда вы пытаетесь объявить массив такого размера, и согласно спецификации нет размера массива 0, как я понимаю):

ISO 9899:2011 6.7.6.2: 

    If the expression is a constant expression, it shall have a value greater than zero. 

Как распределить массив динамически как структуру, содержащую элементы «размер», и каждый элемент представляет собой строку из 80 символов?

#define STR_LEN 80 
struct stack { 
    int top; 
    char *string; 
} stackv; 

enum { 
    SUCCESS = 0, 
    FAILURE, 
}; 

int InitStack(stackv *stackv, int size) { 
    if (size <= 0) 
     return FAILURE; 

    stackv->string = (char *)malloc(size*sizeof(char)*80); 
    if (stackv->string == NULL) 
     return FAILURE; 

    stackv->top = 0; 

    return SUCCESS; 
} 

В основной функции, вы объявите переменную «stackv» и передать его по ссылке (указатель) на функцию инициализации, которую я написал.

+0

Я получаю поле «строка» не может быть разрешено, а поле «сверху» не может быть разрешено. Предупреждение –

+0

Верно, что массивы нулевого размера не допускаются (включая VLA), но фактическая причина предупреждения заключается в том, что вы можете 't объявлять VLA со статической продолжительностью хранения - это не имеет никакого смысла. Если вы хотите сделать это, вы должны использовать простой массив. – Lundin

Смежные вопросы