簡體   English   中英

C 指向結構的雙指針

[英]C Double Pointer to Structure

我正在嘗試在 C 中計算出指向結構的雙指針,但無法弄清楚出了什么問題......簡單的來源如下:

typedef struct
{
    int member;
} mystruct;

void myfunc(mystruct **data)
{
    (*data)->member = 1;
}

void main(int argc, char *argv[])
{
    mystruct **data;

    myfunc(data);

    printf("member = %d\n", (*data)->member);
}

這里問了一個類似的問題: How to work with pointer to pointer to pointer to structure in C? 關於如何通過雙指針修改結構的成員。 解決方案是語法(*data)->member = 1; 這是有道理的。 但是在我這里的小應用程序中,我在執行該行時收到一個段錯誤。 我究竟做錯了什么?

謝謝

如果要取消引用指針,則需要指向某些內容。 嘗試這個:

void main(int argc, char *argv)
{
    mystruct actualThing;
    mystruct *pointer = &actualThing;
    mystruct **data = &pointer;
    myfunc(data);

    printf("Member: %d", (*data)->member);
}

您收到了段錯誤,因為您沒有分配結構。

data的值是垃圾,因此它指向內存中不屬於您的進程或無法訪問的某個位置。

您需要先分配一個mystruct類型的對象。 這是一個適合您的工作示例: http : //ideone.com/XIdJ8

data未初始化,因此不指向任何合理的內存地址。 此外,沒有漂浮的mystruct結構,因此實際上甚至沒有任何可指向的合理數據。 對於您的示例,您希望:

  1. 創建一個mystruct
  2. 做一個指向它的指針。
  3. 制作一個指向該指針的指針。

如果您只需要將雙指針傳遞給庫函數,則無需為其創建變量。 您創建一個普通的指針變量,將其初始化為指向適當的存儲(如果函數需要),然后傳遞指針的地址(從而“動態”創建雙指針)。

我從來沒有使用過 libusb,所以我將舉一個使用標准庫函數的例子。 從聯機幫助頁:

   #include <stdlib.h>

   long int strtol(const char *nptr, char **endptr, int base);

它只是看起來像一個雙指針。 它實際上是一個模擬的通過引用傳遞的單指針。 允許函數返回正常返回值之外的額外信息。 strtol返回一個長整數,但它也可以告訴您字符串內容在什么時候不再像數字。

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

int main(void) {
    char *str = "99RED BALLOONS";
    char *what;
    long num;

    num = strtol(str, &what, 10);
    printf("Quantity: %ld;    Description: %s;\n", num, what);

    return 0;
}

輸出:

Quantity: 99;    Description: RED BALLOONS;

或者你可以試試這個:

void main(int argc, char*argv[])
{
   mystruct *data;
   myfunc(&data);
   printf("member = %d\n", data->member);
}

這在 C++ 中對我有用,不需要指向另一個變量。

你傳遞給它一個指針,但指針沒有指向任何東西。

這可能更有用:

void main(int argc, char *argv[])
{
    mystruct data;
    mystruct *ptr = &data;
    myfunc(&ptr);
    printf("member = %d\n", (*ptr)->member);
}

暫無
暫無

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

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