2014-07-15 61 views
-1

我使用C編程atmega8535我想使用ALFAT OEM模塊將數據保存到閃存磁盤。但是,我有問題,因爲我希望將數據保存到中間程序中的其他變量(數據保存成功,但數據錯誤)。它發生在malloc之後。我已經malloc變量數據。我正在使用超級終端來調試我的程序char * malloc也改變其他char *變量

這是我的代碼。我只顯示相關的

// Declare your global variables here 
char* reply = NULL; 
char* directory = NULL; 
char* fileName = NULL; 
char* getFileName = NULL; 

void writeCommand(char* command){ //to give command to ALFAT 
    //not related 
} 

void readCommand(){ //to request reply from ALFAT 
    //related (because contains malloc and also change my variable) but I give another example 
} 

void get_ErrorCode(char errorCode[4]){ //to get errorCode from ALFAT's reply 
    //not related 
} 

void get_Version(){ //to know ALFAT's version 
    //not related 
} 

void mountUSB0(){ //to mount USB port 0 
    //not related 
} 

void mountUSB1(){ //to mount USB port 1 
    //not related 
} 

void get_fileName(){ //to get fileName from ALFAT's reply after N command 
    //not related 
} 

int check_File(char port[1]){ //to check whether file already exists or not 
    //related (because contains malloc and also change my variable) but I give another example 
} 

void separate_Directory(char* fullDir, char* data){ //to separate directory and fileName from fullDirectory "fullDir" 
    int i,j; 
    int numSlash = 0;    //numberOfSlash 
    int curNumSlash = 0;   //currentNumberOfSlash 

    //CHECK THE DATA BEFORE MALLOC 
    printf("1st GUNYUH data = %s, address data = %x, directory = %s, address directory = %x\n",data,data,directory,directory); 

    //count backslash '\'=0x5C 
    for (i=0;i<strlen(fullDir);i++){ 
     if(fullDir[i]== 0x5C) numSlash++; 
    } 

    //count number of char for directory 
    i=0; 
    curNumSlash = 0; 
    while (curNumSlash != numSlash){ 
     if(fullDir[i]== 0x5C) curNumSlash++; 
     i++; 
    } 

    //i = number of char for directory 
    //number of char for filename = strlen(fullDir)-total char directory 
    do{ 
     directory = (char *) malloc (i+1); 
    }while(directory==NULL); 
    do{ 
     fileName = (char *) malloc (strlen(fullDir)-i+1); 
    }while(fileName==NULL); 

    //CHECK THE DATA AFTER MALLOC (ALREADY CHANGED) 
    printf("2nd GUNYUH data = %s, address data = %x, directory = %s, address directory = %x\n",data,data,directory,directory); 

    //save into directory until last backslash 
    i=0; 
    curNumSlash = 0; 
    while (curNumSlash != numSlash){ 
     if(fullDir[i]== 0x5C) curNumSlash++; 
     directory[i] = fullDir[i]; 
     i++; 
    } 
    directory[i] = '\0'; 

    //remaining fullDir into fileName 
    j=0; 
    while (i < strlen(fullDir)){ 
     fileName[j] = fullDir[i]; 
     i++; 
     j++;  
    } 
    fileName[j] = '\0'; 

    //CHECK THE DATA AGAIN (CHANGED INTO directory) 
    printf("3rd GUNYUH data = %s, address data = %x, directory = %s, address directory = %x\n",data,data,directory,directory); 
    printf("separate directory = %s, fileName = %s, fullDir = %s\n",directory,fileName,fullDir); 
} 


void writeData (char* data, char* fullDir, char port[1], char statFileHandler[16]){ 
//I omit that not related 

    printf("1)!!!!!!!!!!!!!!!!DATA = %s, ADDRESS DATA = %x, DIRECTORY = %s, ADDRESS DIRECTORY = %x\n",data,*data,directory,*directory); 
    separate_Directory(fullDir,data); 
    printf("2)!!!!!!!!!!!!!!!!DATA = %s, ADDRESS DATA = %x, DIRECTORY = %s, ADDRESS DIRECTORY = %x\n",data,*data,directory,*directory); 

//omitted 
} 

void main(){ 
    char* data; 
    char* fullDir = NULL; 
    char port[1]=""; 
    char statFileHandler[16]; 

    //omitted 

    while(1){ 
     //omitted (also omit the mounting) 


     do{ 
      data = (char *) malloc (strlen("meong")+1); //+1 utk \0 
     }while(data==NULL); 
     strcpy(data,"meong"); 
     data[strlen("meong")] = '\0'; 

     fullDir = (char *) malloc (strlen("\\f1\\nyan.txt")+1); 
     strcpy(fullDir,"\\f1\\nyan.txt"); 
     fullDir[strlen("\\f1\\nyan.txt")] = '\0'; 
     for(i=0;i<strlen("\\f1\\nyan.txt");i++){ 
      fullDir[i] = toupper(fullDir[i]); 
     } 

     //omit some printf for debugging 
     printf("fullDir di main= %s\n",fullDir); 

     printf("data di main = %s\n",data); 
     printf("address data di main = %x\n",*data); 
     writeData (data, fullDir, port, statFileHandler); 

     break;       
     } 

     while(1){} 

     } 
    } 
} 

檢查GUNYUH部分。超級終端中的輸出:

1st GUNYUH data = meong, address data = 196, directory = , address directory = 0 
2nd GUNYUH data = , addressdata = 196, directory = , address directory = 196 
3rd GUNYUH data = \F1\, address data = 196, directory = \F1\, address directory = 196 

我在main中的數據是「meong」。 malloc的前

1 GUNYUH,數據仍然是 「meong」 的malloc後

第二GUNYUH,該數據已經改變

3 GUNYUH之後定義的目錄,數據也發生了變化。 (那麼因爲地址也一樣,所以它指向相同的地址)

它爲什麼改變了?

是否因爲內存不足問題?但是,當沒有足夠的堆內存時,malloc將返回NULL,因此它永遠不會從循環中出來。我之前已經經歷過堆內存的缺乏,它不能從循環中出去。

我也有這樣的經驗重疊。但這是因爲我沒有使用malloc。 (但我沒有檢查地址,去靜態數組但沒有足夠的內存,所以回到動態,發現它需要malloc)

請幫忙嗎?

+1

打印地址(指針值)時,要打印(例如)數據而不是* data(這是字符串的第一個字符)。 –

+0

感謝您的糾正。我已經編輯了這個問題。但爲什麼malloc指向數據的地址? – Kalkaneus

+0

請向我們展示您的真實代碼。 – zoska

回答

1

這不是一個答案,但它太大了評論。

您有以下錯誤:

  • 在四個不同的printf行,你通過傳遞空指針%s導致未定義的行爲。 (變量directory)。在未定義的行爲開始後,所有投注都關閉。
  • %x打印指針會導致未定義的行爲。要打印指針,請使用%p並將指針投射到(void *)
  • 你做*THING,而不是在3米不同的地方THING,爲printf
  • Don't cast malloc,轉換可以隱藏指示錯誤
  • 上線for(i=0;i<strlen("\\f1\\nyan.txt");i++){的錯誤消息,i是未申報。
  • 您未能包括stdio.h,stdlib.hstring.hctype.h
  • 在代碼中還有另外兩個}{
  • fullDir = (char *) malloc ...一致後,您不檢查是否malloc失敗。

此代碼不應編譯。這導致我相信你沒有發佈你的真實代碼。請務必過帳正確的失敗的代碼,這一點很重要。

您需要create a minimal program,測試該程序仍然顯示問題,併發布該程序的代碼不變。

這是因爲可能存在「真實代碼」中的問題,而不是您發佈的代碼中存在的問題。由於您不知道問題出在哪裏,因此無法確定是否包含導致問題的部分。

事實上,如果我修復了上面列出的所有錯誤,並在main()結束時刪除了無限循環,則代碼將爲我成功編譯並運行。這表明無論是列出的問題之一是問題,還是問題出現在您未發佈的代碼中。

+0

我發佈我的代碼。但我忽略了我認爲沒有關係。可能會有一些{}意外地被忽略。包括也被省略。也許可以省略一些變量。我已經編輯了我的代碼,所以它們不是*的東西,而是東西。而且我已經編輯了我的結果。所有的程序都是大約800 ++行。我覺得在這裏發佈它太多了。但是,你說得對,問題不在於此。就在最近(最後),我試圖將我釋放的每個變量都NULL()。和我的代碼工作。謝謝回答。 = D – Kalkaneus

+0

您需要發佈您的REAL代碼,否則我們可能無法提供幫助。什麼似乎與你的問題無關,甚至可能是問題的原因。 – zoska

+0

對不起。首先,我認爲REAL代碼與所有代碼不同。看來所有的代碼都是REAL代碼。 – Kalkaneus