2012-08-24 64 views
0

嗨在Visual Studio 2008上嘗試此代碼時,我無法找到編譯錯誤的原因。我試圖看到char *通過函數返回值。錯誤C2106:'=':左操作數在VS2008上必須是c值的l值

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
static char* getActiveModuleType(void); 
void main() 
{ 
char getActiveModuleBuff[128]; 
//error C2106: '=' : left operand must be l-value 
getActiveModuleBuff = getActiveModuleType(); 
printf("Active module in well formatted (2): %s\n",getActiveModuleBuff); 

    exit(0); 
} 
char* getActiveModuleType(void) 
{ 
char activeModule[128]; 
int tempBuffLen=0; 
int nbActivemodule = 0; 
char moduleA  = 1; 
char moduleB  = 1; 
char moduleC  = 0; 
char moduleD  = 1; 
int i = 0; 
if(moduleA==1) {activeModule[i] ='A'; activeModule[i+1]=','; i= i+2;} 
if(moduleB==1) {activeModule[i] ='B'; activeModule[i+1]=','; i= i+2;} 
if(moduleC==1) {activeModule[i] ='C'; activeModule[i+1]=','; i= i+2;} 
if(moduleD==1) {activeModule[i] ='D'; activeModule[i+1]=','; i= i+2;} 

printf(" Active module in : %s\n",activeModule); 
//let get get the last ',' value trucated 
tempBuffLen = strlen(activeModule); 
nbActivemodule = tempBuffLen/2; 
if((tempBuffLen == 0) && (nbActivemodule ==0)){ 
     memcpy(activeModule,"NoActiveModule",14); 
     return activeModule; 
} 
if(activeModule[tempBuffLen-1]==',') 
    activeModule[tempBuffLen-1] = '\0'; 
printf(" Active module in well formatted : %s\n",activeModule); 

return activeModule; 
} 

我無法找到爲什麼此錯誤C2106發生在此代碼中。
需要幫助。
感謝

+0

它試圖告訴你的是'='的左操作數必須是*可修改的*左值。數組是左值,但總體來說它們不是*可修改*。你不能給數組分配任何東西。 – AnT

回答

2
char getActiveModuleBuff[128]; 
getActiveModuleBuff = getActiveModuleType(); 

不能在C.

使用memcpy值賦給一個數組複製一個數組或strcpy/strncpy複製的字符串。

同樣在:

char* getActiveModuleType(void) 
{ 
    char activeModule[128]; 
    /* ... */ 
    return activeModule; 
} 

activeModule陣列對象在函數的末尾銷燬。函數返回後訪問它是未定義的行爲。

1

除了ouah說的。不要返回數組。相反,讓你的函數寫入一個作爲參數傳遞給它的數組,然後返回結果代碼。

將原型getActiveModuleType函數更改爲void getActiveModuleType(char *activeModule)。這將使該函數將您的數組作爲參數並不返回任何內容。

然後,從getActiveModuleType刪除activeModule的聲明,因爲它已被聲明爲參數。

memcpy(activeModule,"NoActiveModule",14);之後,將return activeModule;替換爲return;,因爲你的函數沒有返回任何東西(void)。這會讓你的函數在失敗時退出。

getActiveModuleType的末尾,刪除return activeModule;一行,因爲函數沒有返回任何內容。

而且,在您的main函數中,將getActiveModuleBuff = getActiveModuleType();替換爲getActiveModuleType(getActiveModuleBuff);

+0

嗨, 我正在嘗試一個示例應用程序來練習返回char *的函數。 如果我更改函數的原型來返回void,它不會解決此示例代碼的用途。 – PKHUN

+1

垃圾箱你看到的那本教科書。不要返回數組。決不。 – Triang3l

相關問題