2011-03-04 116 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