通过引用将字符串数组传递给 C 函数

Posted

技术标签:

【中文标题】通过引用将字符串数组传递给 C 函数【英文标题】:Passing an array of strings to a C function by reference 【发布时间】:2011-07-08 13:10:59 【问题描述】:

我很难通过引用将字符串数组传递给函数。

  char* parameters[513]; 

这是否代表 513 个字符串?这是我初始化第一个元素的方式:

 parameters[0] = "something";

现在,我需要通过引用将“参数”传递给函数,以便该函数可以向其添加更多字符串。函数头看起来如何,我将如何在函数中使用这个变量?

【问题讨论】:

问题在于你的“字符串”仍未初始化,所以你的第二个代码 sn-p 会破坏你的记忆。 【参考方案1】:

你已经得到它了。

#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!

【讨论】:

嗨@Dietrich。你能向我解释一下为什么后一种方法不起作用。我正在处理类似的问题,我将 arr 传递给 func ,它是一个包含 4 个字符串、5 个字符长的 [4][6] 数组,它以 char ** 作为参数。但是我无法检索我在被调用函数func 内的被调用函数中填充的字符串。任何帮助都会很棒! 你必须了解内存布局。拿一张纸画东西,你会发现char **xchar y[4][6] 是完全不相容的。编译器应该会给你错误信息。 记住char ** 是一个指向char * 的指针。但是,如果您以char y[4][6] 开头,那么任何地方都没有char *!所以你不能有指向char *的指针。【参考方案2】:

char* parameters[513]; 是一个由 513 个指向 char 的指针组成的数组。相当于char *(parameters[513])

指向那个东西的指针的类型是char *(*parameters)[513](相当于char *((*parameters)[513])),所以你的函数可能看起来像:

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

或者,如果您想要 C++ 参考:

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

【讨论】:

这看起来不必要的复杂。 char *parameters[513] 怎么了? @Dietrich Epp:这没什么问题。您将如何定义此类类型的引用?我的答案就是这个问题的答案。

以上是关于通过引用将字符串数组传递给 C 函数的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何使用 P/Invoke 将字符串数组传递给 C 库?

如何将字符串数组传递给C中的函数?

C++ 通过引用传递向量字符指针

Javascript 是不是通过引用或值将数组传递给函数?

C:将字符串数组作为函数参数传递

如何将 Swift 字符串数组传递给采用 char ** 参数的 C 函数