2016-10-19 36 views
3

我寫了一個程序來交換數組中的兩個結構,我的編碼如下無效的二進制操作數*(有'ab {aka struct a}'和'ab * {aka struct a *}')

#include <stdio.h> 
struct a { 
    char *name; 
    int id; 
    char *department; 
    int num; 
}; 
typedef struct a ab; 

void swap(ab *, ab *); 

int main(int argc, char *argv[]) 
{ 
    ab array[2] = {{"Saud", 137, "Electronics", 500}, {"Ebad", 111, "Telecom", 570}}; 
    printf("First student data:\n%s\t%d\t%s\t%d", array[0].name, array[0].id, 
      array[0].department, array[0].num); 

    printf("\nSecond Student Data\n%s\t%d\t%s\t%d\n", array[1].name, array[1].id, 
      array[1].department, array[1].num); 

    swap(&array[0], &array[1]); 
    // printf("") 
    return 0; 
} 

void swap(ab *p, ab *q){ 
    ab tmp; 
    tmp = *p 
    *p = *q; 
    *q = tmp; 
} 

在編譯它,它給出了一個錯誤,

newproject.c: In function ‘swap’:
newproject.c:26:3: error: invalid operands to binary * (have ‘ab {aka
struct a}’ and ‘ab * {aka struct a *}’)
*p=*q;

什麼是錯?

+2

有時錯誤不在報告的行上,而是在以前的行中。看看前面的一行,看看看起來好不好。例如,也許不會錯過分號? –

+0

[爲什麼編譯器報告缺少分號?](http://stackoverflow.com/questions/40135392/why-doesnt-compiler-report-missing-semicolon) –

回答

9

第26行(上一行)末尾有一個缺失分號。

tmp=*p 

由於這個原因,所述編譯器將認爲下一行是相同的語句的一部分,這意味着,作爲整個語句被解釋:

tmp=*p * p = *q; 

第二*被看作是一個乘法兩個操作數 - *pp - 這是錯誤消息來自何處:

invalid operands to binary * (have ‘ab {aka struct a}’ and ‘ab * {aka struct a *}’)

(因爲*pab類型,而pab *類型)。

相關問題