2014-07-15 62 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