在结构体中使用C字符串

3

我希望我的结构体可以携带一个字符串。 我这样定义了它:

typedef struct myStruct {
  char* stringy
} myStruct

和一个函数
free(char *stringy){
   //structObj is a struct object
   structObj->stringy = stringy
}

这个正确吗?我感觉由于它是局部变量,stringy会丢失,指针会指向垃圾。

抱歉,我对C语言还不熟悉。


你的陈述是正确的,但并不符合您所发布的代码。 - Mitch Wheat
哦,对不起,我有点匆忙修改了这个。 - Secret
9
“free”这个函数可能是个不好的想法。 - Duck
2
@Secret 这仍然是一个不好的想法... - pablo1977
@Secret,请接受我的道歉。我在没有注意到你有意将函数命名为“free”的情况下编辑了你的帖子。这次编辑很小,只是添加了分号,因为你的问题与语法无关。它还将你的“free”函数重命名为“myFree”。有人知道如何取消编辑请求吗? - nonsensickle
显示剩余5条评论
5个回答

2

如果你在某种情况下使用了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"

抱歉我有点挑剔,但我认为你应该得到一个编译器错误/警告,因为你将字符串字面值分配给了一个非const char指针。 - nonsensickle
@nonsensical 我确实收到了编译器警告,但它作为一个例子。 - cwallenpoole

1

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

你需要声明:

typedef struct myStruct {
  char* stringy
} myStruct;

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

请注意我在typedef声明末尾添加的分号。
这在你的代码中没有。
对象structObj是一个类型为myStruct的结构体。
现在,你的参数stringy来自另一个站点,它并没有丢失。
但是结构体structObj只会在你的“free”函数内持续存在。 编辑 我已经修复了一个错误:正确的声明应该是“指向structObj的指针”,可以通过以下方式完成:
  myStruct *structObj;

请注意,现在myStruct是一个未初始化的指针,所以下面的赋值是合法的:
  structObj->stringy = stringy;

但是它不会起作用。
然而,我认为这超出了原始问题的范围...

1
如果在调用free函数的时候,stringy被定义,并且只要保持实际字符串在它所指向的位置,就不会有问题。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接