2016-10-27 33 views
1

給在C結構數組成員的大小我有一個看起來像一個結構 -如何在運行時

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

我想給用戶一個選項,在運行時分配字符字符串數組的大小。 我用了scanf函數來做到這一點 -

我試圖做才達到它 -

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. 

如何動態地將數組分配爲包含「size」元素的結構,每個元素是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),但是警告的實際原因是您可以沒有聲明VLA靜態存儲持續時間 - 這沒有任何意義。如果你想這樣做,你會使用普通數組。 – Lundin