在我正在研究的程序的一部分中,我在不同的情况下以不同的方式指定名称,但显然我希望保留名称。所以我做了类似的事情:
char *name;
if(*condition one*){
char namebuilder[30] = "";
//fill char array here
name = namebuilder;
} else {
name = info->name; //a char* from a struct
}
char otherstring[30] = "______________________________"
所以基本上我遇到的问题是,当函数采用else
路由名称时,工作正常。但是当它使名称构建者和构造名称时,由于某种原因otherstring
最终与名称相同的地址,并且名称被“ __________________________ ”覆盖。我不明白为什么会这样或者我怎么能阻止它。
P.S:我通过打印name和otherstring的地址对它进行了测试,并且它们存储了相同的地址,但仅限于使用了namebuilder。
额外背景:这是我正在制作的一个小程序,因为它可能与线程有关,我想,但我提到的变量都不是全局的。
编辑:这是您要求的实际代码。 struct thread_data { char * name; int max; };void* race(void* params)
{
struct thread_data* info;
info = (struct thread_data*)params;
int len = strlen(info->name);
char* name;
if(info->max > len){
int i;
char newname[30] = "";
for(i = 0; i < info->max-1; i++){
if(i < len){
newname[i] = info->name[i];
} else {
char nextchar = randChar();
newname[i] = nextchar;
}
}
newname[info->max] = '\0';
name = newname;
} else {
name = info->name;
}
pthread_mutex_lock(&locker);
printf(name); //This correctly prints the name either way.
printf(" takes off!\n");
pthread_mutex_unlock(&locker);
//begin trying to spell here.
int spelt = 0;
char spelling[30] = "______________________________";
// All code after this sees name as "______________________________" only if it came
// from the if statement and not the else.
答案 0 :(得分:2)
Namebuilder是if块的本地。您需要将其提升到一个范围,或者使用malloc()将其分配到动态内存中(当您完成时不要忘记释放它)!)
答案 1 :(得分:2)
您的名字构建者是if块的本地名称。这意味着一旦你离开并尝试使用你的name
,现在访问内存name
点是UB。您必须为namebuilder动态分配内存 - 这意味着您必须记住以后要清理它 - 或者您必须将namebuilder的声明提升到它所在的范围内#39;正在使用。
答案 2 :(得分:2)
namebuilder
存储在堆栈中,因为它在if语句中是本地的,在退出条件后,它被标记为空闲,因此在声明otherstring
时,它具有完全相同的类型和内存使用为namebuilder
,它在堆栈中占据了一席之地。
以下是解决问题的方法:
char *name;
char namebuilder[30] = "";
if(*condition one*){
//fill char array here
name = namebuilder;
} else {
name = info->name; //a char* from a struct
}
char otherstring[30] = "______________________________";