C结构中的字符串

时间:2013-09-04 03:51:01

标签: c

我希望我的struct携带一个字符串。我这样定义:

typedef struct myStruct {
  char* stringy
} myStruct

和一个功能

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

这是对的吗?我有一种感觉,因为它是一个局部变量,stringy将丢失,指针将指向垃圾。

对不起,C新手。

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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"

答案 2 :(得分:1)

您的代码中没有任何本地变量声明。

您必须声明:

typedef struct myStruct {
  char* stringy
} myStruct;

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

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

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

现在,您的参数stringy来自另一个网站,它不会丢失 但struct structObj只在你的“free”函数中有持续时间。

编辑

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

  myStruct *structObj;

观察现在myStruct是一个非初始化指针,因此以下赋值是合法的:

  structObj->stringy = stringy;

但不起作用。

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

答案 3 :(得分:0)

myStruct是您为struct myStruct定义的类型。您需要在使用之前创建对象。

你需要这样做:

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);
    }

答案 4 :(得分:-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);
}