在C中重用地址空间?

时间:2014-06-28 21:10:41

标签: c pointers c-strings

在我正在研究的程序的一部分中,我在不同的情况下以不同的方式指定名称,但显然我希望保留名称。所以我做了类似的事情:

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.

3 个答案:

答案 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] = "______________________________";