2015-04-02 21 views
0

char *指針上使用此技術對我有用。 (這裏不顯示,因爲它沒有錯誤)。但是,我將指針傳遞給test_variadic函數的指針。帶有int指針的可變參數列表,不按預期方式工作

gcc -Wall -Wextra -Werror -Wpadded -std=c99 test.c -o test 我嘗試用va_arg(args, int**)提取它編譯,然後我會去參考指針值分配給它,我得到這個錯誤:

test.c: In function ‘test_variadic’: 
test.c:14:6: error: assignment makes pointer from integer without a cast [-Werror] 
    *aa = b++;  
    ^
cc1: all warnings being treated as errors 

#include <stdio.h> 
#include <stddef.h> 
#include <stdarg.h> 

static int test_variadic(size_t length, ...) 
{ 
    int** aa; 
    int b = 4; 
    va_list args; 
    va_start(args, length); 

    for(size_t i = 0; i < length; i++) { 
     aa = va_arg(args, int**); 
     *aa = b++;    
    } 

    va_end(args); 

    return 0; 
} 

int main() 
{ 
    int* a, *b; 

    if(test_variadic(2, &a, &b) == 0) { 
     printf("%d %d\n", *a, *b); 
    } 

    return 0; 

} 

所以基本上我想要做的是將函數指針傳遞給變量(在本例中爲int s),然後我想將這些指針分配給一個值(來自函數test_v*。我希望能夠通過指向t的指針他的功能,然後分配一個值的指針。我希望能夠分配一個不是指針的值,以便我可以在main中訪問它。

+3

解引用一個int **會給你一個int *,而b是一個int(在函數內部)。看起來像你應該使用int *參數,將main的a和b轉換爲int而不是int *的 – rici 2015-04-02 02:55:27

+0

建議:在'test_variadic'中使用不同的變量名稱而不是'main',所以當我們回答你的問題時,我們可以說'a'而不是'主要的a'與'test_variadic的a'(這是不同的變量) – 2015-04-02 03:00:43

回答

1

錯誤與可變參數列表無關;你正在做一個類型不匹配。您的代碼是:

int **aa; // a points to a pointer-to-int 
int b; 

// .... make 'a' point somewhere 

*aa = b; // error: (*aa) is a pointer-to-int, but you try to assign an int 

根據您的職位說明,看來你想*a點的地方,會發現4

天真地你可能會寫*aa = &b; ++b;然而,這將失敗,因爲當函數返回時b被銷燬。所以,你將不得不分配內存:然後

*aa = malloc(sizeof **aa); 
if (! *aa) 
    return 1; 

**aa = b++; 

main函數應該打印值後做free(a); free(b);

+0

我編輯了我的更多細節我想要做什麼 – 2015-04-02 03:00:25

+0

去接受你的答案..但我解決了我的自己的問題(哈哈)。我只能傳遞一個指向int int的指針; test_variadic(&i);'不需要數組的輸入 – 2015-04-02 03:10:29

+0

無論如何,沒有人提出過一個數組......但很高興你通過數組解決了 – 2015-04-02 03:10:57