2

我希望我的结构带有一个字符串。我是这样定义的:

typedef struct myStruct {
  char* stringy
} myStruct

和一个函数

free(char *stringy){
   //structObj is a struct object
   structObj->stringy = stringy
}

这个对吗?我有一种感觉,既然是局部变量,stringy会丢失,指针会指向垃圾。

抱歉,C 的新手。

4

5 回答 5

1

如果在函数stringy的调用者中定义free,只要他们将实际字符串保留在其位置(位置stringy点),就没有问题。

于 2013-09-04T03:54:26.387 回答
1

如果你以某种方式使用它会是垃圾char** stringy,但它structObj->stringy = stringy的意思是“你知道stringy指向的东西吗?现在structObj->stringy指向那个”。当然,仍然可以取消设置指针指向的值,此时取消引用将产生垃圾。

这是一个更清楚的示例:

 #include<stdio.h>
 typedef struct mStruct {
  char* stringy;
 } myStruct;

 myStruct * structObj;

 void doSomething(char* stringy)
 {
      structObj->stringy = stringy;
 }

 int main(int argc, char* argv)
 {
      char* a = "abc\n";
      structObj = malloc(sizeof(myStruct));
      doSomething(a);
      a = "qxr\n";
      printf(structObj->stringy);
 }// prints "abc\n"
于 2013-09-04T03:59:43.457 回答
1

您的代码中没有任何局部变量声明。

您必须声明:

typedef struct myStruct {
  char* stringy
} myStruct;

free(char *stringy){
   myStruct *structObj;
   structObj->stringy = stringy;
}

请注意我添加到 typedef 声明末尾的分号。
这不在您的代码中。

对象 structObj 是一个类型为 myStruct 的结构。

现在,您的参数 stringy 来自另一个站点,它不会丢失。
但是 struct structObj 将仅在您的“免费”函数内具有持续时间。

编辑

我修正了一个错误:正确的声明必须是“指向 structObj 的指针”,这是通过这种方式完成的:

  myStruct *structObj;

注意现在 myStruct 是一个未初始化的指针,所以下面的赋值是合法的:

  structObj->stringy = stringy;

但不会工作。

但是我认为这超出了原始问题的范围......

于 2013-09-04T04:02:41.303 回答
0

myStruct是您为struct myStruct.that 定义的类型,您需要在使用前创建一个对象。

你需要这样做:

typedef struct myStruct {
  char *stringy;  
} myStruct_t; //user defined  data type  

 myStruct_t *obj;  

// you need to allocate memory dynamically.   
 obj= (myStruct_t *) malloc(sizeof(myStruct_t)); 

用法:

scanf("%s",obj->stringy);

printf("%s",obj->stringy);

在功能上:

  my_free(char *str)  //str is local string 
    {
     obj->stringy=str;
    }

你也可以试试这个代码:

typedef struct myStruct {
  char stringy[20]; //char *stringy  
} myStruct_t; //user defined  data type

myStruct_t obj; //object creation    

用法:

scanf("%s",obj.stringy);

printf("%s",obj.stringy);

在功能上:

   my_free(char *str)  //str is local string 
    {
       strcpy(obj.stringy,str);
    }
于 2013-09-04T04:01:49.553 回答
-1

你是对的,一旦它指向的内容超出范围,它就会指向垃圾:这是一个悬空指针。您需要分配一些内存并执行复制来解决此问题:

add_string(my_struct* s, const char* c)
{
    size_t len = strlen(c);
    s->file = malloc(len + 1);
    strcpy(s->file, c);
}

不要忘记free完成后你需要它:

void destroy_struct(my_struct* s)
{
    free(s->file);
    free(s);
}
于 2013-09-04T03:59:18.567 回答