2011-03-04 158 views
4

我很難通過引用將一個字符串數組傳遞給函數。通過引用將字符串數組傳遞給C函數

char* parameters[513]; 

這是否代表513個字符串?這裏是我的初始化的第一個元素:

parameters[0] = "something"; 

現在,我需要按引用傳遞「參數」的功能,使功能可以添加多個字符串它。函數頭看起來如何,我將如何在函數內使用這個變量?

+4

不,它不是hw。 – user246392 2011-03-04 03:56:32

+0

問題在於你的「字符串」保持未初始化,所以你的第二個代碼片段會損壞你的內存。 – 2011-03-04 03:57:13

回答

16

你已經明白了。

#include <stdio.h> 
static void func(char *p[]) 
{ 
    p[0] = "Hello"; 
    p[1] = "World"; 
} 
int main(int argc, char *argv[]) 
{ 
    char *strings[2]; 
    func(strings); 
    printf("%s %s\n", strings[0], strings[1]); 
    return 0; 
} 

在C中,當您傳遞數組的函數,編譯器接通數組的指針。 (陣列「衰變」到一個指針。)的「FUNC」上方是完全等效於:

static void func(char **p) 
{ 
    p[0] = "Hello"; 
    p[1] = "World"; 
} 

由於一個指針數組傳遞,當修改的陣列,要修改的原始陣列和不是副本。

您可能想了解指針和數組在C中的工作方式。與大多數語言不同,在C中,指針(引用)和數組的處理方式有很多相似之處。一個數組有時會衰減到一個指針,但只在非常特定的情況下。例如,這不起作用:

void func(char **p); 
void other_func(void) 
{ 
    char arr[5][3]; 
    func(arr); // does not work! 
} 
+1

謝謝。有效! – user246392 2011-03-04 04:10:46

+0

Hi @Dietrich。你能向我解釋爲什麼後一種方法行不通。我正在研究一個類似的問題,我傳遞了一個'arr',它是一個包含4個字符串,長度爲5個字符的'[4] [6]'數組到一個'func',它將char **作爲參數。但是我無法檢索到我在被調用函數'func'中的callee函數中填充的字符串。任何幫助都是極好的! – tcpip 2017-06-26 06:26:30

+0

你必須瞭解內存佈局。拿一張紙並畫東西,你會發現'char ** x'和'char y [4] [6]'是完全不相容的。編譯器應該給你錯誤信息。 – 2017-06-26 07:03:39

0

char* parameters[513];是指向char的513個指針的數組。這相當於char *(parameters[513])

一個指針,指向的是char *(*parameters)[513]類型(這相當於char *((*parameters)[513]))的,所以你的功能可能看起來像:

void f(char *(*parameters)[513]); 

或者,如果你想有一個C++參考:

void f(char *(&parameters)[513]); 
+0

看起來不必要的複雜。 'char *參數有什麼問題[513]'? – 2011-03-04 04:08:31

+0

@Dietrich Epp:它沒什麼問題。你如何定義這種類型的參考?我的答案是這個問題的答案。 – peoro 2011-03-04 04:10:29