char*的malloc也更改其他char*变量
我正在用C语言编程atmega8535。我想用ALFAT OEM模块将数据保存到闪存中。但是,我有问题,因为我想保存的数据在中间程序中变为其他变量(数据保存是成功的,但是数据是错误的)。它发生在malloc之后。我已经对变量数据进行了malloc。我正在用超级终端调试我的程序 这是我的密码。我只显示相关的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
// 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