【问题标题】:Passing a string array to a function using pointers使用指针将字符串数组传递给函数
【发布时间】:2017-04-27 12:46:44
【问题描述】:

所以我试图将一个 char 数组传递给一个函数并将其打印出来,然后返回该数组。

以下是我的主要功能。我正在做二叉搜索树,但我只是坚持传递一个 char 数组。

int main()
{
    BST tree = new_bst();
    int noRecords;
    int tfn;
    char name[10];
    char *test;

    FILE *fileptr;
    fileptr = fopen("welfare1.txt", "r");
    fscanf(fileptr, "%d", &noRecords);
    fscanf(fileptr, "%s", name);
    fscanf(fileptr, "%d", &tfn);

    insert_bst(&tree, tfn, &name);
}

到目前为止,这里是插入 BST 函数。我还没有实现它,因为我无法将名称字段传递给我的函数,我使用 printf 作为测试,看看它是否有效。

BSTNodePtr insert_bst_node(BSTNodePtr self, int n, char *name)
{

    if (self == NULL)
    {
        TaxRecordPtr newRecord = new_record();


        self = malloc(sizeof *self);
        self->data = newRecord;
        self->left = self->right = NULL;

        printf("%c", name[0]);
}

【问题讨论】:

  • ....问题是....?
  • &name 不是char*!但是普通的name 衰减到一个...
  • 数组只通过引用传递,所以 insert_bst(&tree, tfn, name);BSTNodePtr insert_bst_node(BSTNodePtr self, int n, char name[]) 应该适合你
  • 使用 insert_bst(&tree, tfn, name); and BSTNodePtr insert_bst_node(BSTNodePtr self, int n, char name[]) 它逐步执行,但 printf 函数失败,我得到了这个 在 Assign1.exe 中的 0x0F63125C (ucrtbased.dll) 处引发的异常:0xC0000005:访问冲突读取位置 0x0000007C。
  • 您在insert_bst_node 中的括号不匹配,并且名称与对insert_bst 的调用不匹配

标签: c arrays function pointers


【解决方案1】:

改变

insert_bst(&tree, tfn, &name);

insert_bst(&tree, tfn, name);

除非它是sizeof 或一元& 运算符的操作数,或者是用于在声明中初始化字符数组的字符串文字,否则为“T 的N 元素数组”类型的表达式将被转换(“decay”)为“pointer to T”类型的表达式,表达式的值将是数组第一个元素的地址。

当你打电话时

insert_bst(&tree, tfn, name);

表达式name 不是sizeof 或一元& 运算符的操作数,因此它“衰减”为键入char *,它与函数定义中的参数类型相匹配。

当你打电话时

insert_bst(&tree, tfn, &name);

表达式name 一元& 运算符的操作数,因此不会发生转换;相反,表达式的类型是char (*)[10],或“指向char 的10 元素数组的指针”,它与函数定义中的参数类型不匹配。

【讨论】:

    【解决方案2】:

    char 数组等价于指向 char 的指针。 因此,当引用一个 char 数组时,所需的类型将是一个指向 char 的双指针

    BSTNodePtr insert_bst_node(BSTNodePtr self, int n, char **name)
    

    无论如何,传递指向 char 数组的指针是没有意义的,你可以只传递 char 数组本身

    insert_bst(&tree, tfn, name);
    

    您不会按值传递 char 数组,因为数组等同于指针。

    【讨论】:

    • name&name 的衰减类型都不是 char**
    • &name 是指向数组的指针,而不是指向 char 指针的指针。 数组和指针是不同的动物甚至数组可以衰减指针...
    猜你喜欢
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 2013-02-15
    • 1970-01-01
    • 2018-06-15
    相关资源
    最近更新 更多