2011-12-13 47 views
2

能夠定義例如C中的左值,右值和數組初始化

int a[] = {1,2,3}; 

是非常方便的,但是,數組a是一個r值,所以我不能隨後更改a中的值,例如,

a[] = {4,5,6}; 

爲希望做到這一點的上下文被寫入一串單元測試,其中我在我的陣列饋送到功能和測試輸出。我正在用不同的輸入對相同的函數進行測試,並希望避免爲我的輸入數組設置唯一的名稱,例如我不得不這樣做:

int test1_a[] = {1,2,3}; 
/* calls to functions */ 

int test2_a[] = {4,5,6}; 
/* calls to functions */ 

另外,如果我想要一個指針傳遞給數組到一個函數我一定要第一個投這樣的:

int a[] = {1,2,3}; 
int *b = a; 

my_func(&b); 

指針傳遞到像這樣的r值不起作用:

my_func(&a); 

我的問題是,是否有任何其他的方法可以輕鬆地初始化值的數組沒有這些限制的痛苦? (特別是,以使它容易寫許多類似的單元測試,而不每次測試具有一組獨特的陣列名)

+5

這可能是相關的:http://stackoverflow.com/q/8380348/726361 –

+1

如果你唯一的問題是重新初始化數組而不重新編譯,那麼你可以從文件或數據庫中讀取它。 (別忘了大小!)。 – wildplasser

+0

好點 - 我認爲這可能是要走的路。我現在正在從Python回到C,因此所有這些(可能)基本上愚蠢的問題... – bph

回答

1

如果您已經有想要傳遞給函數的值,爲什麼不使用多維數組?

int a[][] = { 
    { 1, 2, 3 }, 
    { 4, 5, 6 } 
} 

for (int i = 0; i < 2; i++) 
{ 
    /* Call functions with 'a[i]' as argument */ 
} 

此外,如果您調用的函數需要一個數組,並且您有一個例如int a[] = {...}; int *b = a;,那麼請不要撥打電話&b。使用&b會傳遞指針的地址,而不是它指向的內容。

+0

不錯的建議,這看起來像一個整潔的解決方案。我認爲memcpy路由只是進一步混淆事物並引入潛在的可移植性問題。我會獨自離開那一個。 – bph

1

這裏的一個選項:

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

void ReinitArray(int* p, size_t cnt, ...) 
{ 
    va_list ap; 

    va_start(ap, cnt); 

    while (cnt--) 
    { 
    *p++ = va_arg(ap, int); 
    } 

    va_end(ap); 
} 

int array[5] = { 1, 2, 3, 4, 5 }; 

int main(void) 
{ 
    size_t i; 

    printf("array[5]="); 
    for (i = 0; i < 5; i++) printf("%d ", array[i]); 
    printf("\n"); 

    ReinitArray(array, 5, 11, 22, 33, 44, 55); 

    printf("array[5]="); 
    for (i = 0; i < 5; i++) printf("%d ", array[i]); 
    printf("\n"); 

    return 0; 
} 

輸出:

array[5]=1 2 3 4 5 
array[5]=11 22 33 44 55 

你可以簡單地寫my_func(a);其中a是一個數組名。這相當於傳遞&a[0],即第一個數組元素的地址。您不能直接將整個陣列作爲C中的函數參數傳遞。

1

如果我已經正確理解了您的問題,我想下面的內容可以解決您的問題。

memcpy(a, (int[]){3, 2, 1}, sizeof a); 

僅當您的c編譯器支持複合文字(c99向前)時。

要指定標準,可以將gcc調用爲「gcc -std = c99 -Wall -pedantic」。