通过引用将字符串数组传递给 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 **x
和char 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 *(¶meters)[513] );
【讨论】:
这看起来不必要的复杂。char *parameters[513]
怎么了?
@Dietrich Epp:这没什么问题。您将如何定义此类类型的引用?我的答案就是这个问题的答案。以上是关于通过引用将字符串数组传递给 C 函数的主要内容,如果未能解决你的问题,请参考以下文章