char*的malloc也更改其他char*变量

char*的malloc也更改其他char*变量,c,memory-management,malloc,overlap,atmega,C,Memory Management,Malloc,Overlap,Atmega,我正在用C语言编程atmega8535。我想用ALFAT OEM模块将数据保存到闪存中。但是,我有问题,因为我想保存的数据在中间程序中变为其他变量(数据保存是成功的,但是数据是错误的)。它发生在malloc之后。我已经对变量数据进行了malloc。我正在用超级终端调试我的程序 这是我的密码。我只显示相关的 // Declare your global variables here char* reply = NULL; char* directory = NULL; char* fileName

我正在用C语言编程atmega8535。我想用ALFAT OEM模块将数据保存到闪存中。但是,我有问题,因为我想保存的数据在中间程序中变为其他变量(数据保存是成功的,但是数据是错误的)。它发生在malloc之后。我已经对变量数据进行了malloc。我正在用超级终端调试我的程序

这是我的密码。我只显示相关的

// 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){}

      }
   }
}
我的主要数据是“meong”

malloc之前的第一个GUNYUH,数据仍然“meong”

malloc之后的第二个GUNYUH,数据已经更改

第三个GUNYUH定义了目录后,数据也发生了变化。(因为地址也一样,所以它指向相同的地址)

为什么会改变

是因为缺乏记忆的问题吗?但是,当堆内存不足时,malloc将返回NULL,因此它永远不会从循环中退出。我以前已经经历过堆内存不足的情况,但它确实无法从循环中退出

我也经历过这样的重叠。但这是因为我没有使用malloc。(但我没有检查地址,并选择静态数组,但没有足够的内存,因此返回到动态,并发现它需要malloc)


请提供一些帮助?

这不是答案,但太大了,无法发表评论

您有以下错误:

  • 在四个不同的
    printf
    行中,通过为
    %s
    传递空指针,导致未定义的行为。(变量
    目录
    )。在未定义的行为开始之后,所有的赌注都被取消
  • 使用
    %x
    打印指针会导致未定义的行为。要打印指针,请使用
    %p
    并将指针强制转换为
    (void*)
  • 对于
    printf
  • ,则强制转换可能会隐藏指示错误的错误消息

  • 在(i=0;i)的
    行上,当打印地址(指针值)时,您希望打印(例如)数据而不是*数据(字符串的第一个字符)。谢谢你的更正。我已经编辑了这个问题。但是为什么malloc用数据指向同一个地址?请给我们看看你的真实代码。我正在发布我的代码。但是我忽略了我认为不相关的内容。可能是{}意外省略。包括也省略了。可能一些变量省略了。我已经编辑了我的代码,所以它们不是*东西,而是东西。而且我已经编辑了我的结果。所有的程序大约有800++行。我认为在这里发布太多了。但是,你是对的,问题不在那里。就在最近(最后),我尝试将我释放的每个变量都设为NULL()。我的代码有效。谢谢你的回答。=你需要发布真实代码,否则我们可能无法提供帮助。对你来说似乎与问题无关的东西甚至可能是问题的原因。对不起。首先我认为真实代码不同于所有代码。似乎所有代码都是真实代码。嗯……我只想编辑以添加所有代码。B但正文似乎有字符限制。不要发布所有代码。删除所有不相关的代码行。然后检查程序是否仍在编译,删除这些行后问题是否仍然存在。然后发布。
    
    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