函数返回结构编译由gcc失败,但由vc6.0 sccessful

时间:2014-02-17 11:06:01

标签: c gcc

为什么这不能通过gcc编译,而是通过vc6.0

成功编译

gcc版本4.1.2 20070115(SUSE Linux)

linux:~# cc t.c
t.c: In function ‘main’:

t.c:24: error: invalid use of non-lvalue array - printf((confFQDNtolower(&tFQDN)).strName);

代码:

#include <stdio.h>
#include <ctype.h>

typedef struct  {
    char strName[128];
    unsigned short wLen;
}T_FQDN;

T_FQDN confFQDNtolower(T_FQDN *ptFQDN)
{
    static T_FQDN tFQDN = {0};
    int i;

    tFQDN.wLen = ptFQDN->wLen;
    for (i = 0; i < ptFQDN->wLen; i++)
    {
        tFQDN.strName[i] = tolower(ptFQDN->strName[i]);
    }

    return tFQDN;
}

int main()
{
    T_FQDN tFQDN = {"a.B.c", 5};

    printf((confFQDNtolower(&tFQDN)).strName);

    return 0;
}

3 个答案:

答案 0 :(得分:1)

尝试

printf(&(confFQDNtolower(&tFQDN).strName[0]));

请参阅此处接受的答案和评论,以了解为什么这会改变一切。  C - invalid use of non-lvalue array

答案 1 :(得分:0)

你唯一需要改变的是printf()行:

printf("%s", (confFQDNtolower(&tFQDN)).strName);

上述内容适用于GCC和VisualStudio的CL编译器。

答案 2 :(得分:-3)

我认为应该以下列方式更改代码。

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

typedef struct  {
    char *strName;
    unsigned short wLen;
}T_FQDN;

T_FQDN confFQDNtolower(T_FQDN *ptFQDN)
{
    static T_FQDN tFQDN = {NULL,0};
    int i;

    tFQDN.wLen = ptFQDN->wLen;

    if(!tFQDN.strName) free(tFQDN.strName);
    tFQDN.strName = strdup(ptFQDN->strName);


    for (i = 0; i < ptFQDN->wLen; i++)
    {
        tFQDN.strName[i] = tolower(tFQDN.strName[i]);
    }


    return tFQDN;
}