【问题标题】:C - How to pass an array of strings to another function by reference?C - 如何通过引用将字符串数组传递给另一个函数?
【发布时间】:2012-10-24 19:42:22
【问题描述】:

这是我的代码:

void doSomething(){
    char arr[5][10];
    arr[1] = "Bob";
    arr[2] = "Steve";
    arr[3] = "Tim";
    arr[4] = "Ruth";
    arr[5] = "Heather";
    init(arr);

void init(char *array){
    int i;
    newArr[5][10];
    for(i=0; i<5; i++){
        newArr[i] = *(array + i);
    }
}

我不断收到错误提示:

警告:从不兼容的指针类型传递“init”的参数 1 [默认启用] 注意:预期为“char ”,但参数类型为“char ()[10]”

【问题讨论】:

  • 你的编译器告诉你真相。您已将 array 声明为 char * 类型,但您正在使用它,就好像它被声明为 char *[] 类型一样。

标签: c


【解决方案1】:

您的数据是一个二维数组,因此您的函数需要考虑一个指针数组(即char (*array)[10]char array[][10])。

此外,在您的 init 函数中,您不能只将字符串复制到数组中,您需要复制所有数据(作为带有 strcpy 的字符串或带有第二个循环的逐个字符的字符串),或者只是复制指向字符串的指针(所以将您的 newArr 变量设为 char *newArr[5])。

如果这些都没有任何意义,那么您可能应该通过阅读C FAQ on this topic 来复习您的 C 指针知识。

【讨论】:

  • @AdamRosenfield 我从来没有说过数组是指针。如果要将数组传递给函数,则将参数列为指针,传入的数组衰减为指针。
  • 一个数组衰减到一个指针,但只在第一级。二维数组不会衰减为指向指针的指针:它衰减为指向数组的指针。所以char [5][10] 衰减为char (*)[10],但不会衰减为char**
  • @texasbruce 其实仔细想想,他是对的。我同意他对所有事情都投反对票是愚蠢的。也许我会改变我的答案更合适。
  • 我对答案投了反对票因为他们错了。您不能将char [5][10] 传递给采用char ** 的函数。尝试一下。您会从 OP 那里得到准确的编译器警告。如果你不顾警告而尝试运行它,它会崩溃并且不会做你想做的事情,其根本原因是数组不是指针。我怎么强调都不过分。请参阅C FAQ
  • @NiklasR 您会收到与原始帖子中相同的警告:warning: passing argument 1 of ‘test’ from incompatible pointer type 该站点可能不会显示警告。
【解决方案2】:

1) C 中没有字符数组赋值 strcpy() 并且数组从 0 开始而不是 1:

#include <string.h>
void doSomething(){
    char arr[5][10];
    strcpy(arr[0], "Bob");
    strcpy(arr[1], "Steve");
    strcpy(arr[2], "Tim");
    strcpy(arr[3], "Ruth");
    strcpy(arr[4], "Heather");
    init(arr);
}

2) init() 接受一个指向 char 数组的指针; newArr[][] 未声明,添加 char。在源代码的开头添加init() 的声明。最后但同样重要的是:再次用strcpy() 替换分配。

void init(char (*array)[10]);

void doSomething() {...}

void init(char (*array)[10]){
    int i;
    char newArr[5][10];
    for(i=0; i<5; i++){
        strcpy(newArr[i], array[i]);
    }
}

最后,这可能很无聊,但是看看https://stackoverflow.com/tags/c/infoC FAQ 并拿起一本书。这将为您提供比我更好、更长久的服务。

【讨论】:

  • 感谢您的帮助,我正在学习 C 并且有点挣扎。至于从 0 开始的数组,我知道这一点,但不知道为什么我从 1 开始可能是因为我很着急。再次感谢您的帮助。
【解决方案3】:

这不是错误。这是一个警告。正如您在 doSomething 中看到的 arr 是一个双精度数组(可以使用双指针表示),但在 init 中您只使用一个指针。将其更改为双指针 **arrayarray[][]*

【讨论】:

    猜你喜欢
    • 2011-07-08
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 2020-10-21
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    相关资源
    最近更新 更多