簡體   English   中英

C-指針,數組和結構之間的交互

[英]C- Interaction between pointers, arrays, and structs

我一直在閱讀C語言中的指針和數組,以期學習如何將VLA形式的東西實現為結構的成員。 (具體來說,我需要一個數組或類似數組的對象,其長度在結構實例之間不同,但在編譯時為任何特定的結構實例定義。)

在我看來好像是這樣的:

typedef struct example{
    unsigned char length;
    char *data;
}example;

int buildExample(example e, unsigned char l, char * const d){
    e.length = l;
    e.data = d;
    return 0;
    //not safe I know, but that fact isn't relevant to the question.
}


main(){
    example e;
    unsigend char a = 5;
    char b[] = {1, 2, 3, 4, 5};
    buildExample(e, a, b);
    int i = 0;
    while(i < e.length){
        printf("%d  %d\n", i, e.b[i]);
        i++;
    }
    printf("%d  %d\n", i, e.b[i]);
}

應該導致類似以下輸出:

0  1
1  2
2  3
3  4
4  5
5  some unknown value or a segfault, not sure which

各種指針和存儲單元等應如下所示:

before call to buildExample:

example e.data                 b               address 0, 1, 2...
|null pointer|         |ptr to address 0|      |  1  |  2  |  3  |  4  |  5  |

after call to buildExample:

example e.data                  address 0, 1, 2...
|ptr to address 0|              |  1  |  2  |  3  |  4  |  5  |

但是相反,我只是遇到了段錯誤。 如果我將e.data換成b,則得到“未知值”結果(無論出於何種原因,為32765、32766或32767),如果我將e.data換成新的int * c,其定義和設置為等於b在主要方面,我得到的結果與b相同,這對我意味着e.data實際上不是buildExample設置為b的。

為什么不?

調用buildExample() ,實際上是傳遞了main()創建的e結構的副本,因此,該函數返回時,所有更改都將丟失。 請改用指針。

int buildExample(example *e, unsigned char l, char * const d){
    e->length = l;
    e->data = d;
    return 0;
    //not safe I know, but that fact isn't relevant to the question.
}

並在致電時:

buildExample(&e, a, b);

但是,您還有其他錯誤,例如unsigend char a = 5; (應為unsigned而不是“ unsigend”),並嘗試訪問名為b的元素(應為data )。

buildExample(&e, a, b);
while(i < e.length){
    printf("%d  %d\n", i, e.data[i]);
    i++;
}
printf("%d  %d\n", i, e.data[i]);

希望能幫助到你!

此發布的代碼存在一些問題。

1) main() )的返回類型始終是int而不是空白

2)函數: buildExample()修改e參數(在堆棧上),但對調用者中的e變量沒有任何影響。應該將指針傳遞給struct並將賦值更改為e->lengthe->data

3)使用unsigned not unsigend`

4)使用無意義的變量和參數名稱會使代碼不必要地難以理解

5)在對printf()的調用中, example結構沒有成員b

強烈建議在發布問題之前實際編譯發布的代碼。

typedef struct example
{
    unsigned char dataCount;
    char *pData;
} example;

void buildExample(example *pExample, unsigned char dataCount, char * const pData)
{
    pExample->dataCount = dataCount;
    pExample->pData = pData;
}


int main( void )
{
    example myExample;
    unsigned char dataCount = 5;
    char data[] = {1, 2, 3, 4, 5};

    buildExample(&myExample, dataCount, data);

    for( int i=0; i<myExample.count; i++)
    {
        printf("%d  %d\n", i, myExample.pData[i]);
    }
    printf("%d  %d\n", i, myExample.pData[i]);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM