【问题标题】:Pointer to array of structures in C指向 C 中结构数组的指针
【发布时间】:2011-06-24 15:52:40
【问题描述】:

请告诉我如何将指向 C 中结构数组的指针作为函数参数传递。

下面是我的代码。

#include <stdio.h>
#include<strings.h>



typedef struct _Alert
{
    char   MerchantNo[21];
    time_t last_update;
} Alert;
typedef Alert *PALERT;


int set(PALERT palertMerch[5], int *merchnoIndex, char * txnMerchant)
{
    strcpy(palertMerch[*merchnoIndex]->MerchantNo, txnMerchant);
    *(merchnoIndex) = *(merchnoIndex) + 1 ;

    return 0;
}

int main()
{
    Alert alert[5];

    for(int i =0; i<5;i++)
    {
        memset(alert[i].MerchantNo, 0x00, 21);
        alert[i].last_update = (time_t)0;
    }

    char *p = "SACHIN";
    int index = 0;
    set(alert[5], index, p);
}

错误信息

"3.c", line 34: argument #1 is incompatible with prototype:
        prototype: pointer to pointer to struct _Alert {array[21] of char MerchantNo, long last_update} : "3.c", line 14
        argument : struct _Alert {array[21] of char MerchantNo, long last_update}
"3.c", line 34: warning: improper pointer/integer combination: arg #2
cc: acomp failed for 3.c

【问题讨论】:

    标签: c arrays structure


    【解决方案1】:

    你只需传递数组,它就会衰减指向指向第一个数组元素的指针:

    set( alert, &index, p );
    

    请注意,我还纠正了您将整数作为第二个参数的指针传递的第二个错误。

    编辑0:

    我错过了PALERT 的声明——你的函数定义是错误的,应该是这样的:

    int set( PALERT palertMerch, int* merchnoIndex, const char* txnMerchant )
    {
        assert( *merchnoIndex >= 0 && *merchnoIndex < 5 );
        strcpy( palertMerch[*merchnoIndex].MerchantNo, txnMerchant );
        ...
    }
    

    我知道,数组和指针在 C 中有点令人困惑,您已经尝试跳转到指针数组 :)

    【讨论】:

    • 我试了一下,得到了“3.c”,第 34 行:警告:参数 #1 与原型不兼容:原型:指向结构 _Alert {array[21] of char MerchantNo, long last_update}:“3.c”,第 14 行参数:指向结构 _Alert {array[21] of char MerchantNo,long last_update}“3.c”,第 34 行的指针:警告:不正确的指针/整数组合:arg #2
    • 这个功能也应该是固定的;它需要两个间接级别。
    • @Atrefacto,请清楚你的意思是通过两个间接级别
    • 能否请您给我一个更正。我想通过引用传递这个结构数组,所以应该修改原始内容。
    • @Sachin Chourasiya 通过 2 级间接,他的意思是 PALERT palertMerch[5]。 PALERT 已经是一个指针。因此,您已将参数声明为指向指针的指针。正确的方法是说 ALERT palertMerch[5]PALERT palertMerch (或者因为这是一个函数参数,所以只是 ALERT *palertMerch
    【解决方案2】:

    您实际上不能将数组传递给函数。当你这样做时,会发生什么是指向数组中第一个元素的指针被传入。 (这个过程通常被描述为“一个数组衰减成一个指针”)。

    也就是说,

    set(alert, index, p);
    

    和以下一样:

    set(&alert[0], index, p);
    

    (请注意,您将其称为 set(alert[5], index, p); ,这只是传入数组的 6. 元素,顺便说一句,这是无效的,因为您的数组只有 5 个元素的空间。)

    所以,当你想将数组传递给函数时,你会做什么

    1. 传递一个指向数组第一个元素的指针(这可以通过写name_of_array&amp;name_of_array[0]来完成
    2. 添加另一个参数,即数组的长度。你可能需要这个,就好像你的数组可以有不同的大小一样,如果你得到的只是一个指向它的第一个元素的指针,你就无法知道一个数组有多少元素:

    让我们暂时跳过上面的第 2 项,你可以这样做:

        //PALERT is already a pointer, otherwise specify the first argument as:
        //ALERT *palertMerch
        int set(PALERT palertMerch, int *merchnoIndex, char * txnMerchant) 
        {
            strcpy(palertMerch[*merchnoIndex]->MerchantNo, txnMerchant);
            *(merchnoIndex) = *(merchnoIndex) + 1 ;
    
            return 0;
        }
    

    然后这样称呼它:

    char *p = "SACHIN";
    int index = 0;
    set(alert, index, p);
    

    顺便说一句,除非你有充分的理由,否则尽量不要像在 typedef Alert *PALERT; 中那样在 typedef 中隐藏指针,这样做常常会让人感到困惑。

    【讨论】:

      【解决方案3】:

      删除数组括号,它应该可以工作。 这样做的原因是数组表示法是一种更简单的方式来表示内存中的项目序列。例如,在数组 a[5] 中,您可以将第三个元素作为 a[3] 或 *(a+3) 访问。

      【讨论】:

        【解决方案4】:

        您的函数采用 PALERT *[5] 类型。您正在传递 Alert[5] 。您的代码还有其他问题需要修复才能成功运行。

        【讨论】:

        • @Peception,还有哪些问题
        • 你好 Sachin,你能参考上面@nos 的帖子吗?他几乎涵盖了所有内容。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-16
        • 1970-01-01
        • 2017-06-03
        相关资源
        最近更新 更多