2017-01-11 37 views
1

我发现在gcc 6.1.0中编译但在gcc中没有编译的代码中出现“错误:赋值给数组类型的表达式”错误4.4.6。在使用va_arg()解析参数时发现错误gdb-6.1.0

void foo(char *fmt, ...) 
{ 
    va_list ap; 
    int d; 
    char *c, *s; 
    typedef unsigned char mac_t[6]; 

    mac_t ad; 
    va_start(ap, fmt); 
    while (*fmt) 
    switch (*fmt++) { 
    case 's': 
     s = va_arg(ap, char *); 
     printf("string %s\n", s); 
    break; 
    case 'd':    /* int */ 
     d = va_arg(ap, int); 
     printf("int %d\n", d); 
    break; 
    case 'c':    /* char */ 
     ad = va_arg(ap, mac_t); //**** error here only on gcc 6.1.0 compiler 
     printf("With unsigned char: char %c.%c.%c.%c.%c.%c\n", ad[0],ad[1],ad[2],ad[3],ad[4],ad[5]);            
    } 
    va_end(ap); 
} 
int main() 
{ 
    foo("%c", "AABBCC"); 
}  

我该如何解决这个错误?在gcc 4.4.6中,编译顺利进行。由于某些原因,我只需要使用gcc 6.1.0编译器。

+0

我尝试过strcpy(ad,va_arg(ap,mac_t));.它不会给我任何编译器错误。但它没有达到目的。我的意思是,参数不会被复制到数组广告。我在打印广告内容时看到无效数据。 –

+1

传递给函数时,数组衰减为指针类型。 gcc 6.1.0正确,你不能分配给一个数组。 – jxh

+0

@jxh正是。 strcpy()在指针上不起作用。任何其他方式来解析gcc 6.1.0中的参数? –

回答

1

您有:

typedef unsigned char mac_t[6]; 
mac_t ad; 

然后尝试:

ad = va_arg(ap, mac_t); 

时,你已经通过了论证是这样的:

foo("%c", "AABBCC"); 

这是一个错误。你不能分配给一个数组。而且,"AABBCC"是char的数组[7],因为NUL以字符串结尾。但是,这并不重要。 foo()接收到一个char *,因为数组类型衰减到包含其第一个元素地址的指针。

如果您将-std=c99传递给GCC,您应该能够看到该错误。显然,这可以进行更严格的检查。

gcc -std=c99 -W -Wall -O c.c 
c.c: In function ‘foo’: 
c.c:25:12: error: incompatible types when assigning to type ‘mac_t’ from type ‘unsigned char *’ 
     ad = va_arg(ap, mac_t); // error here only on gcc 6.1.0 compiler 
      ^

要解决此问题,请告诉va_arg您正在解析指针。如果您必须复制内容,请使用strncpy

strncpy((void *)ad, va_arg(ap, char *), sizeof(ad)); 

我们强迫ad,因为strncpy需要一个char *作为第一个参数。

+0

是的。此解决方案工作。 –

相关问题